C++ char массив вне области видимости или нет?
У меня есть метод, который требует указателя const char в качестве входных данных (не завершается нулем). Это требование библиотеки (TinyXML), которую я использую в своем проекте. Я получаю входные данные для этого метода из вызова метода string.c_str().
Нужно ли удалять этот символьный указатель? Строка выходит из области видимости сразу после завершения вызова; поэтому строка должна удалить его с помощью вызова деструктора, правильно?
4 ответа
Массив char, возвращаемый string.c_str(), обнуляется.Если функция tinyXML использует буфер NUL-символов с нулевым символом в конце, то вы, вероятно, получите неожиданное поведение.
const char * c_str () const;
Получить эквивалент строки C
Создает завершенную нулем последовательность символов (c-string) с тем же содержимым, что и строковый объект, и возвращает ее в качестве указателя на массив символов.
Завершающий нулевой символ добавляется автоматически.
Нет, его не нужно выпускать. Деструктор String делает это для вас.
Возвращенный массив указывает на внутреннее местоположение с требуемым пространством хранения для этой последовательности символов плюс его завершающий нулевой символ, но значения в этом массиве не должны изменяться в программе и могут оставаться неизменными только до следующего вызова непостоянная функция-член строкового объекта.
источник: http://www.cplusplus.com/reference/string/string/c_str/
Не удаляйте память, полученную из std::string::c_str. За это отвечает строка (и вполне возможно, что она дала вам указатель на свой внутренний буфер, поэтому, если вы удалили его, это было бы плохо (tm)).
С другой стороны,
Если вам не нужен символьный указатель для нулевого завершения, вам лучше использовать str.data()
скорее, чем str.c_str()
, Разница в том, что .data()
не гарантирует, что то, что вы получите, будет аннулировано. Это полезно, если ваша строка просто занимает всю длину внутреннего буфера, выделенного string
, В этом случае звонит .c_str()
заставит string
перераспределить дату в новый больший буфер, который содержит достаточно места для добавления '\0'
в конце.
В любом случае, конечно, вы не должны удалять возвращаемый указатель. string
позаботится об этом.
std::string.c_str() возвращает указатель на завершенную нулем строку. Фактический массив символов по-прежнему принадлежит объекту std:: string, и он действителен до тех пор, пока:
- Объект std:: string является действительным, и
- Не выполняются вызовы неконстантных функций-членов в объекте std:: string (т.е. изменение строки делает недействительной любую предыдущую указанную строку в стиле C).
Это зависит от самого строкового объекта, чтобы выделить и освободить завершенный массив nul, который он возвращает вам.
Вы всегда можете использовать строку с нулевым символом в конце в качестве строки с нулевым символом. В конце концов, NTS - это просто не-NTS с дополнительным нулем в конце. Пока строка правильно завершается, как ожидает функция, она никогда не увидит "лишний" нуль.:)