#c
#c
Вопрос:
У меня есть класс, которому необходимо сохранить файл, конструктор получает LPWSTR с именем fullPath , затем я попытался это сделать (curPath — это переменная класса LPCWSTR):
curPath = (std::wstring(fullPath) L".ip").c_str();
но в итоге получается тарабарщина. Между тем это работает:
auto cp = std::wstring(fullPath) L".ip";
curPath = cs.c_str();
хотя мне кажется, что они должны по существу делать то же самое. Что с этим?
Комментарии:
1. У вас опечатка в последней строке, не так ли?
2.
(std::wstring(fullPath) L".ip").c_str()
будет временноstd::wstring
сконструировано, а затем уничтожено. Указатель, который вы получите (c_str()
), будет мусором, как вы заметили. Но, поместив результат в переменную с правильной областью видимости, строка будет висеть достаточно долго, чтобы вы могли использовать ее осмысленно.3. ах да, опечатка. Мне нужно, чтобы строка сохранялась довольно долго, поскольку я буду удалять и переделывать файл во время использования класса. Должен ли я сделать std::wstring переменной класса вместо LPWSTR и использовать ее функцию c_str() каждый раз, когда она мне нужна?
4.
private: std::wstring m_curPath;
возможно, это правильный путь. А может, и нет. Это зависит от того, для чего вам это нужно.5. Ключевым моментом здесь является то, что это
curPath
зависит отwstring
того, существует ли объект.
Ответ №1:
Временный std::wstring, созданный выражением (std::wstring(fullPath) L".ip")
, будет уничтожен после вычисления выражения. Использование внутренней памяти этого временного (предоставляемого c_str) является неопределенным поведением и ошибкой.
Во втором выражении результат сохраняется в автоматической переменной cp. Таким образом, до конца текущей области вам разрешено использовать внутреннюю память переменной cp. Как только область действия закончится, cp is будет уничтожен, а его память освобождена.