объединение LPCWSTR с другой строкой

#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 будет уничтожен, а его память освобождена.