我正在尝试添加两个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;
}
现在当我在返回时设置一个断点时,值似乎很好,返回= Source / Shaders / shader.fx按预期方式。但是当我F10回到我的对象中时,ShaderFile变量变成了一个完全随机的东西,一堆似乎是阿拉伯符号的东西。
有人能指出我做正确的方向吗?正如我所说,函数似乎工作正常,就在我通过断点返回到我的项目时,变量等于完全不同的东西
答案 0 :(得分:1)
发生的事情是你正在为返回无效的数据返回一个地址,所以在函数返回之前一切都会好起来,但是在结果之后,它就是所有(至少可能是)垃圾。
如果可能的话,只需返回std::wstring
,并在调用代码中的某个位置调用其c_str()
成员函数,当您真正需要它时,以原始缓冲区的形式。
如果你不能这样做,只需必须将结果作为原始LPCWSTR
返回,那么你可能需要动态分配空间:
LPCWSTR *ret = new char [ShaderPath.size()];
strcpy(ret, ShaderPath.c_str());
return ret;
然后,当不再需要时,调用代码需要delete []
内存。
你确实想要避免后者,而只是返回std::wstring
。它更加简单和清洁,并且在你完成使用它之前删除缓冲区会保存几乎不可避免的问题,或者在你完成使用它时忘记删除它(在C中仍然是严重的问题,但在本质上是闻所未闻的写得很好C ++)。
答案 1 :(得分:1)
wstring.c_str()
返回字符串的内部指针。
在你的情况下,当你退出函数时会破坏局部变量,因此返回的指针被释放,你会得到意想不到的结果。
可能的解决方案是使用方法wcscpy()
答案 2 :(得分: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());