2016-11-16 1 views
-2

Пример ниже, у меня есть fn как указатель const, указывающий на постоянную c-строку. Когда я объявляю и назначаю несвязанный другой константный указатель на другую константу c-string, исходный fn изменяется. Я пытался выяснить, почему на какое-то время, но не могу понять, что может это сделать?Почему присвоение несвязанной строки вызывало изменение другой строки?

Выход:

Оригинал сноска: sampleStrWithExtension

Модифицированный сноска: randomStr2ModifiedFn

int main() { 
     std::string baseString = "sampleStr"; 
     std::string randomBaseString = "randomStr2"; 
     const char* const fn = (baseString + "WithExtension").c_str(); 
     std::cout << "Original fn: " << fn << std::endl; 
     const char* const variableNotFn = (randomBaseString + "ModifiedFn").c_str(); 
     std::cout << "Modified fn: " << fn << std::endl; 
     return 0; 
    } 
+1

'fn = (baseString +" WithExtension "). C_str()' не очень простое назначение. Объект 'string', созданный выражением' baseString + 'WithExtension' ', немедленно уничтожается после завершения этого назначения, оставляя переменную' fn', указывающую на нераспределенную память, которая может быть повторно использована в любое время. –

+4

Время жизни 'x.c_str()' никогда не продолжается за время жизни 'x'. – Angew

ответ

8
const char* const fn = (baseString + "WithExtension").c_str(); 

Это приводит к непредсказуемому поведению.

baseString + "WithExtension" 

Это создает временный объект std::string. Оператор + на std::string возвращает новый std::string, и в контексте этого выражения возвращаемый std::string становится временным объектом. c_str() возвращает указатель на внутренний буфер этого временного объекта.

Указатель, возвращаемый c_str(), действителен только до тех пор, пока не будет изменен его std::string, или он будет уничтожен. В конце указанного выражения временный объект уничтожается.

Использование этого указателя позже приводит к неопределенному поведению.

+2

Строго говоря, это не неопределенное поведение. Это всего лишь указатель на не существующую строку. Неопределенное поведение происходит, когда вы разыгрываете его – valdo

Смежные вопросы