2013-10-21 140 views
2

我想在增加兩個變量LPCWSTR

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

添加兩個變量LPCWSTR我已經嘗試了一千種不同的方式,但我最近一直是這個

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; 
} 

現在,當我在返回中放置一個斷點,該值看起來不錯,按預期返回= Source/Shaders/shader.fx。但是當我F10回到我的對象中時,ShaderFile變量變成了完全隨機的東西,一堆看似阿拉伯符號的東西。

任何人都可以指出我該做什麼的正確方向?正如我所說,功能似乎工作正常,只是當我F10通過斷點回到我的項目變量等於完全不同的東西

+0

+1問這個問題之前,使用調試器。 –

回答

1

發生什麼事情是,你正在返回一個地址數據,由於返回被無效,所以在函數返回之前一切看起來都很好,但在結果之後立即就是(至少可能)垃圾。

如果有可能,只要返回std::wstring,並在調用代碼中的某處調用它的c_str()成員函數時,如果真的需要原始緩衝區的形式。

如果你不能做到這一點,根本必須返回結果爲原料LPCWSTR,那麼你可能需要動態分配空間:

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

然後,調用代碼當不再需要內存時需要delete []

真的想避免後者,只是返回std::wstring雖然。它更簡單和更清晰,並且可以節省在完成使用之前刪除緩衝區的幾乎不可避免的問題,或者在完成使用時忘記刪除緩衝區(C中仍然存在嚴重問題,但基本上沒有聽說過體面寫的C++)。

+0

謝謝您的解決方案和其他所有人都有幫助的答案。我試圖避免在對象類中使用.c_str(),以避免在不同的行上操作結果,從而使這些行相互依賴。爲LPCWSTR創建第二個參數將被傳入並返回工作嗎?如果是這樣,你會認爲更好的編程習慣嗎?乾杯 – Matt

1

wstring.c_str()返回字符串的內部指針。

在你的情況下,當你退出函數時局部變量被銷燬,因此返回的指針被解除分配,你會得到意想不到的結果。

可能的解決方案將是使用該方法wcscpy()

1

的問題是,該c_str()方法返回一個指針到本地變量ShaderPath的存儲器複製的字符串。當函數退出時,ShaderPath與您的LPCWSTR指向的數據一起銷燬。

爲什麼你不把變量存儲爲wstring,並且只要你需要LPCWSTR,你可以撥打c_str()

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

假設你有一個功能Foo(LPCWSTR path),你會用它想:

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

std::wstring ShaderFile = GetShader(L"shader.fx"); 
Foo(ShaderFile.c_str());