Как выделить больше памяти для буфера в C ++? - PullRequest
3 голосов
/ 12 марта 2010

У меня есть указатель str:

char* str = new char[10];

Я использую блок памяти str, чтобы хранить данные.

Как я могу выделить больше байтов для буфера, на который указывает str, и не потерять старые данные, хранящиеся в буфере?

Ответы [ 8 ]

17 голосов
/ 12 марта 2010

Вместо этого используйте std :: string . Он будет делать то, что вам нужно, не беспокоясь о выделении, копировании и т. Д. Вы все еще можете получить доступ к необработанной памяти через функцию c_str ().

Даже std::vector<char> будет хорошо работать для вас.

8 голосов
/ 12 марта 2010

new[] другой буфер, скопируйте туда данные (используйте для этого memcpy()), затем delete[] старый, назначьте новый адрес буфера указателю, который изначально содержал старый адрес буфера.

3 голосов
/ 12 марта 2010

Вы не можете использовать конструкцию new. Для этого вам нужно использовать старые добрые malloc, realloc и free (не смешивайте malloc / realloc / free и new / delete).

1 голос
/ 12 марта 2010

Если вы действительно используете C ++, наиболее правильным решением будет использование std :: vector. Я предполагаю, что вы не используете эту информацию в качестве стандартной строки, в этом случае вы должны использовать std :: string (которая является специализацией std :: vector, так что нет ничего сложного). Вы создаете как минимум 10 символов. Это дает мне подсказку, что вы, вероятно, совершенно уверены, что вам понадобится 10 символов, но возможно вам понадобится больше. Возможно, вы беспокоитесь о проблемах производительности, связанных с выделением и освобождением памяти. В этом случае вы можете создать свою строку и затем зарезервировать предполагаемую емкость, которая, как вы ожидаете, вам понадобится, поэтому перераспределения не будет, по крайней мере, пока вы не достигнете этого предела.

int main()
{
    std::string s;
    s.reserve( 10 );
    // do whatever with s
}

Как уже отмечали другие, использование std :: string или std :: Vector поможет вам забыть о копировании, изменить размер или удалить зарезервированную память.

0 голосов
/ 12 марта 2010

Распределение немного похоже на поиск места для парковки. Вы спрашиваете здесь, возможно ли добавить прицеп на ваш автомобиль, который был припаркован на несколько дней.

Ответ таков: в C существует нечто, называемое realloc, которое позволяет вам делать следующее. Если у меня уже есть достаточно места, чтобы добавить свой трейлер, сделайте это. Если нет парковки в другом месте, достаточно большом для вашего прицепа и вашего автомобиля, что эквивалентно копированию ваших данных.

Другими словами, вы получите сильный и случайный удар по производительности.

Так что бы вы делали в реальном мире? Если бы вы знали, что вам может понадобиться добавить несколько прицепов к вашему автомобилю, вы, вероятно, припаркуетесь в большем месте, чем требуется. А при превышении размера, необходимого для этого места, вы переместите свой автомобиль и прицепы в место с хорошим запасом для будущих прицепов.

Это именно то, что делает строка и вектор STL для вас. Вы даже можете дать им подсказку о размере вашего фьючерсного трейлера, позвонив «резерв». Использование std :: string, вероятно, лучший ответ на вашу проблему.

0 голосов
/ 12 марта 2010

Вы можете использовать realloc: http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/ Я хотел бы добавить, что этот подход не является предпочтительным подходом c ++ (в зависимости от ваших потребностей вы можете использовать std::vector<char>, например).

0 голосов
/ 12 марта 2010

Вы должны выделить другой, больший массив строк и скопировать данные из str в этот новый массив строк.

0 голосов
/ 12 марта 2010

Функция realloc - это то, что вы ищете. Вы должны были использовать malloc / free вместо new / delete, чтобы использовать его

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...