Является ли возвращение строкового литерального адреса из функции безопасным и переносимым? - PullRequest
15 голосов
/ 03 марта 2010

Мне нужна функция для возврата строки, которая будет доступна только для чтения. Содержимое строки известно во время компиляции, поэтому я все равно буду использовать строковый литерал.

Я могу вернуть что-то вроде std::string:

std::string myFunction()
{
   return "string";
}

или возврат const char*:

const char* myFunction()
{
   return "string";
}

Является ли вторая альтернатива безопасной и переносимой в этом сценарии?

Ответы [ 3 ]

14 голосов
/ 03 марта 2010

Является ли вторая альтернатива безопасной и переносимой в этом сценарии?

Да! Распределение строковых литералов в памяти static и онисохраняться в течение всего срока действия приложения.

10 голосов
/ 03 марта 2010

Да! Но остерегайтесь этой потенциальной ошибки:

char * myFunc() {
    return "Constant string?";
}

Да, вы можете преобразовать строковый литерал в неконстантный char *! Это позволит вам позже разрушить мир, пытаясь изменить содержимое этого char *. Эта «особенность» существует по старым причинам - строковые литералы старше, чем const, и первоначально были определены как char * в C.

g ++, к счастью, выдает это неприятное предупреждение, даже в режиме по умолчанию. Я не знаю, так ли охотно выдает VC ++ предупреждение.

3 голосов
/ 03 марта 2010

Да. (Хранение такого указателя в глобальной структуре данных не отличается).

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