2

次のように2つのLPCWSTR変数を追加しようとしています

Shader = L"shader.fx"
Path = L"Source/Shaders/"
return Path + Shader

私は千の異なる方法を試しましたが、私の最新のものはこれでした

LPCWSTR ShaderFile = GetShader(L"shader.fx");

....

LPCWSTR GetShader(std::wstring _Shader)
{
    std::wstring ShaderPath = static_cast<std::wstring>(SHADER_DIRECTORY) + _Shader;
    LPCWSTR Return = ShaderPath.c_str();
    return Return;
}

戻り値にブレーク ポイントを設定すると、値は問題ないように見えます。return = Source/Shaders/shader.fx は期待どおりです。しかし、F10 キーを押してオブジェクトに戻ると、ShaderFile 変数は完全にランダムで、アラビア記号のように見えるものの集まりであることがわかりました。

誰かが何をすべきか正しい方向に私を向けることができますか? 私が言ったように、関数は正常に動作しているようですが、F10 キーを押してブレークポイントを介してプロジェクトに戻ると、変数はまったく異なるものに等しくなります。

4

3 に答える 3

1

は、文字列のwstring.c_str()内部ポインタを返します。

あなたの場合、関数を終了するとローカル変数が破棄されるため、返されたポインターの割り当てが解除され、予期しない結果が得られます。

考えられる解決策は、メソッドを使用して文字列をコピーすることですwcscpy()

于 2013-10-21T06:07:43.643 に答える
1

何が起こっているのかというと、リターンによって無効化されているデータにアドレスを返しているため、関数が戻る前はすべて問題ないように見えますが、結果の直後はすべて (少なくとも潜在的に) ゴミです。

可能であれば、 を返すだけで、生のバッファの形式で本当に必要なときstd::wstringに、呼び出しコードのどこかでそのメンバー関数を呼び出します。c_str()

それができず、単に結果を raw として返す必要LPCWSTRがある場合は、おそらくスペースを動的に割り当てる必要があります。

LPCWSTR *ret = new char [ShaderPath.size()];
strcpy(ret, ShaderPath.c_str());
return ret;

次に、呼び出し元のコードが不要にdelete []なったときにメモリが必要になります。

あなたは本当に後者を避けたいと思ってstd::wstringいます。それははるかに単純でクリーンであり、使い終わる前にバッファーを削除するか、使い終わったときにバッファーを削除するのを忘れるという、ほぼ避けられない問題を解決します (C では依然として深刻な問題ですが、基本的に前代未聞のことです)。まともに書かれたC ++)。

于 2013-10-21T06:06:02.907 に答える
1

問題は、メソッドがローカル変数のメモリc_str()にポインターを返すことです。ShaderPath関数が終了すると、ShaderPathが指すデータとともに破棄されますLPCWSTR

変数を として保存し、wstring必要なときにいつでもLPCWSTR呼び出すことができますc_str()か?

std::wstring GetShader(std::wstring _Shader)
{
    return static_cast<std::wstring>(SHADER_DIRECTORY) + _Shader;
}

function があると仮定すると、次のFoo(LPCWSTR path)ように使用します。

Foo(GetShader(L"shader.fx").c_str());

また

std::wstring ShaderFile = GetShader(L"shader.fx");
Foo(ShaderFile.c_str());
于 2013-10-21T06:08:38.217 に答える