Подтвердить что ты не робот

Назначает ли std::string:: assign "право собственности" на строку?

У меня есть некоторые пробелы в понимании метода 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=? Если он не копирует, то освобождает ли он память, или это моя ответственность?

Спасибо.

4b9b3361

Ответ 1

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

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

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

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

UPDATE: MSDN содержит несколько примеров различных перегрузок assign.

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

Нет, исходный указатель на массив символов по-прежнему несет ответственность.

Ответ 2

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

Ответ 3

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

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

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