Компилятор политик по уничтожению временных - PullRequest
2 голосов
/ 12 апреля 2011

Я играл со следующим фрагментом кода.file_string возвращает временную строку, которая должна «жить» только до конца оператора.В Visual Studio 2008, когда вы используете pTempFolder, он содержит мусор, как и ожидалось.Однако в Linux с компилятором Intel 11.0 pTempFolder все еще указывает на допустимую строку.Есть ли у компиляторов разные политики в отношении уничтожения временных файлов, вроде нетерпеливый (Visual) и ленивый (Intel)?Или, может быть, это просто совпадение?

boost::filesystem wpathTempFolder("/tmp");
const wchar_t* const pTempFolder = wpathTempFolder.file_string().c_str();
// use pTempFolder

Кстати, это версия Boost для файловой системы 2. Я также видел, что file_string не рекомендуется в версии 3 для файловой системы Boost.c_str метод, который работает над строкой &, а не над временной строкой.

/*filesystem 2*/
const string_type file_string() const;
/*filesystem 3*/
const string_type&  native() const;  // native format, encoding
const value_type*   c_str() const;   // native().c_str()

Ответы [ 2 ]

5 голосов
/ 12 апреля 2011

Вероятно, строка по-прежнему недействительна, просто так получилось, что этот раздел памяти еще не был выделен на уровне операционной системы, и он "работает".Эта программа демонстрирует неопределенное поведение, которое всегда включает «может продолжать работать, как будто ничего не пошло не так».Visual Studio абсолютно прав здесь, чтобы вывести из строя вашу программу или что-то еще.

2 голосов
/ 12 апреля 2011

Время жизни временного (за некоторыми исключениями) до конца полного выражения.Время жизни объекта массива, на которое указывает возвращаемое значение std::string::c_str(), не превышает время жизни самого строкового объекта (и может быть короче, если в строке вызываются неконстантные функции).Доступ к объекту после окончания его времени жизни - неопределенное поведение, поэтому вы не можете сделать какие-либо выводы из того, что делает компилятор.

...