c ++ char массив вне области видимости или нет? - PullRequest
1 голос
/ 12 мая 2009

У меня есть метод, который требует указатель const char в качестве входных данных (не завершается нулем). Это требование библиотеки (TinyXML), которую я использую в своем проекте. Я получаю входные данные для этого метода из вызова метода string.c_str ().

Нужно ли удалять этот символьный указатель? Строка выходит из области видимости сразу после завершения вызова; поэтому строка должна удалить ее с помощью вызова деструктора, правильно?

Ответы [ 4 ]

10 голосов
/ 12 мая 2009

Не удаляйте память, полученную из std :: string :: c_str. За это отвечает строка (и вполне возможно, что она дала вам указатель на свой внутренний буфер, так что если вы удалили его, это было бы плохо (tm)).

8 голосов
/ 12 мая 2009

Массив char, возвращаемый string.c_str (), завершается нулем. Если функция tinyXML принимает буфер char *, не заканчивающийся нулем, то вы, вероятно, получите неожиданное поведение. const char * c_str () const;

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

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

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

Нет, его не нужно выпускать. Деструктор String сделает это за вас.

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

источник: http://www.cplusplus.com/reference/string/string/c_str/

4 голосов
/ 12 мая 2009

На другой ноте
Если вам не нужно указатель на символ, чтобы завершить нулем, лучше использовать str.data() вместо str.c_str(). Разница в том, что .data() не гарантирует, что то, что вы получите, будет аннулировано. Это полезно, если ваша строка просто занимает всю длину внутреннего буфера, выделенного string. В этом случае вызов .c_str() заставит string перераспределить дату в новый больший буфер, в котором достаточно места для добавления '\0' в конце.

В любом случае, конечно, вы не должны удалять возвращаемый указатель. string позаботится об этом.

1 голос
/ 12 мая 2009

std :: string.c_str () возвращает указатель на завершенную нулем строку. Фактический массив символов все еще принадлежит объекту std :: string, и он действителен до тех пор, пока:

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

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

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

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