0

こんにちは私はいくつかのアドバイスを探していますクラスのコマンドインタープリターで働いていますそして私は内部変数からいくつかのc文字列を取得してstd::wstringを作成するこの「コマンド」(つまりクラス)を持っていますそしてそれをwchar_tにキャストします*しかし、それを返すと、変数にごみが表示されます。

戻る前の変数の内容:

comandos disponibles:ayuda salir

返却後の変数の内容:

����������������������������������������

関数にconstwchar_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;
}
4

1 に答える 1

1

スタックに割り当てられた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;
}

もう1つの方法は、ヒープに文字列を割り当てることです。その場合は、どこかで文字列を削除する必要があります。そうしないと、メモリリークが発生します。

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.
}
于 2012-09-15T01:11:13.413 に答える