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, и он действителен до тех пор, пока:

  1. Объект std:: string является действительным, и
  2. Не выполняются вызовы неконстантных функций-членов в объекте std:: string (т.е. изменение строки делает недействительной любую предыдущую указанную строку в стиле C).

Это зависит от самого строкового объекта, чтобы выделить и освободить завершенный массив nul, который он возвращает вам.

Вы всегда можете использовать строку с нулевым символом в конце в качестве строки с нулевым символом. В конце концов, NTS - это просто не-NTS с дополнительным нулем в конце. Пока строка правильно завершается, как ожидает функция, она никогда не увидит "лишний" нуль.:)

Другие вопросы по тегам