wchar_t * странное поведение

привет, я ищу совета
я работаю в интерпретаторе команд для класса, и у меня есть эта «команда» (то есть класс), которая получает некоторые строки c из внутренних переменных и создает std :: wstring, затем я приводю его к wchar_t *, но когда я возвращаю его, я получить просто мусор на переменную, pe

содержимое переменной до возврата:

comandos disonibles: айуда салир

содержимое переменной после возврата:

я попытался заставить функцию возвращать константу wchar_t *, но она также не работает, но если я добавлю строку в ответ, она будет работать нормально.

return L"test"

любая идея?

—редактировать—

это код, который я использую

wchar_t * ayuda::run(std::list<char* const> * lista){

std::wstring out;

out += L"comandos disponibles:\n"; //static header
commandMap map = loadMap();//get a map whit all the function names

commandMap::iterator it;
for(it = map.begin(); it != map.end();it++){
out+=std::wstring(it->first.begin(),it->first.end())+L"\n";// append the command name to the string
}
wchar_t * _out = const_cast<wchar_t*>( out.c_str() ); //cast to wchar *
return _out;
}

0

Решение

Вы пытаетесь вернуть wchar_t *, выделенный в стеке?

wchar_t *MyFunction()
{
wchar_t myString[] = L"This will be destroyed from the stack on returned";
return myString;
}

В этом случае строка удаляется из стека, а затем возвращается мусор. Что бы объяснить, что вы видите.

В C ++ используйте std :: string или std :: wstring для строк, это предотвращает утечки памяти, а также предоставляет полезные функции. Избегайте массивов как можно больше.

#include <string>

std::wstring MyFunction()
{
std::wstring myString = L"This will be copied, since this is not a pointer, but an instance of an object.";
return myString;
}

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

wchar_t *MyFunction()
{
wchar_t myString[] = L"This will be destroyed from the stack on returned";
size_t myStringLen = wcslen(myString);

wchar_t *outString = new wchar_t[myStringLen+1]; //allocate heap memory
wcscpy(outString, myString); //copy the string to heap memory

return outString; //return a string that will not be destroyed.
}
1

Другие решения

Других решений пока нет …