Нужно ли освобождать указатель, возвращаемый std :: string.c_str () или std :: string.data ()? - PullRequest
5 голосов
/ 18 сентября 2011

Насколько я знаю, std::string создает идентификатор массива-копии своего содержимого, когда вы вызываете методы c_str() / data() (с / без завершающего NUL-char, здесь не имеет значения). Во всяком случае, объект также заботится об освобождении этого массива или я должен?

Короче говоря:

std::string hello("content");

const char* Ptr = hello.c_str();

// use it....

delete[] Ptr;   //// really ???

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

Ответы [ 5 ]

7 голосов
/ 18 сентября 2011

Нет, вам не нужно освобождать указатель ptr.

ptr указывает на неизменяемую строку, расположенную где-то во внутреннем местоположении (на самом деле это детали реализации компиляторов).


Ссылка:

Документация C ++ :

const char* c_str ( ) const;

Получить эквивалент строки C

Создает завершенную нулем последовательность символов (c-string) с тем же содержимым, что и строковый объект, и возвращает его в качестве указателя на массив символов.

Завершающий нулевой символ добавляется автоматически.

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

2 голосов
/ 18 сентября 2011

Нет необходимости, dtor класса string будет обрабатывать уничтожение строки, поэтому, когда 'hello' выходит из области видимости, он освобождается.

1 голос
/ 18 сентября 2011

std :: string обрабатывает этот указатель, поэтому не отпускайте его.Кроме того, существует два ограничения на использование этого указателя:
1. Не изменяйте строку, на которую указывает этот указатель, она доступна только для чтения.
2. Этот указатель может стать недействительным после вызова другого std ::строковые методы.

0 голосов
/ 18 сентября 2011

Класс std::string отвечает за освобождение памяти, выделенной для хранения символов строки, когда объект класса уничтожается.Поэтому, если вы выполните

delete[] Ptr;

до или после уничтожения объекта hello (выходит из области действия C ++ {}, в которой он был создан), ваша программа столкнется с проблемой попытки освободить блок памятиэто уже освобождено.

0 голосов
/ 18 сентября 2011

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

...