Принимает ли std :: string :: assign право собственности на строку? - PullRequest
24 голосов
/ 12 июля 2010

У меня есть некоторые пробелы в понимании метода string::assign.Рассмотрим следующий код:

char* c = new char[38];
strcpy(c, "All your base are belong to us!");
std::string s;
s.assign(c, 38);

Выделяет ли s.assign новый буфер и копирует ли в него строку или принимает владение указателем;т.е. не выделяет новую память и использует непосредственно мой адрес.Если он копирует, то в чем разница между assign и operator=?Если он не копируется, освобождает ли он память или это моя ответственность?

Спасибо.

Ответы [ 3 ]

30 голосов
/ 12 июля 2010

Распределяет ли s.assign новый буфер и копирует в него строку или предполагает владение указателем;

Строковый метод STL assign скопирует массив символов встрока.Если уже выделенного буфера внутри строки недостаточно, он перераспределяет память внутри.Строка STL будет не вступать во владение исходным массивом.

Если он копирует, то в чем разница между assign и operator =?

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

ОБНОВЛЕНИЕ: MSDN имеет несколько примеров различных assign перегрузок.

Если он не копирует, освобождает ли он память или это моя ответственность?

Нет, оригинальный указатель на массив символов по-прежнему остается вашей ответственностью.

14 голосов
/ 12 июля 2010

Копирует. Разница между assign и operator = заключается в том, что вы можете указать количество копируемых символов , включая нулевые символы . Оператор = просто копирует c-строку до первого нулевого байта.

1 голос
/ 12 июля 2010

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

Но все реализации позаботятся об очистке - поэтому вам не нужно вручную освобождать строковую память (вот что такое строковые объекты). Конечно, вы должны освободить ваши строковые объекты, если они созданы в куче (или использовать смарт-указатель);)

Назначение и оператор = могут быть реализованы в терминах друг друга, поскольку они делают одно и то же - в зависимости от того, какая версия назначения вызывается (для всех перегрузок см. cpp reference ).

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