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 上设置一个断点时,该值似乎很好, return = Source/Shaders/shader.fx 正如预期的那样。但是当我按 F10 回到我的对象时,ShaderFile 变量变成了完全随机的东西,一堆看起来像阿拉伯符号的东西。

谁能指出我该做什么的正确方向?正如我所说,该功能似乎工作正常,就在我 F10 通过断点回到我的项目时,变量等于完全不同的东西

4

3 回答 3

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 中基本上闻所未闻)写得很体面的C++)。

于 2013-10-21T06:06:02.907 回答
1

返回字符串的wstring.c_str()内部指针。

在您的情况下,当您退出函数时局部变量被破坏,因此返回的指针被释放并且您得到意外的结果。

可能的解决方案是使用该方法复制字符串wcscpy()

于 2013-10-21T06:07:43.643 回答
1

问题是该c_str()方法正在返回一个指向局部变量ShaderPath内存的指针。当函数退出时ShaderPath,连同你的LPCWSTR.

为什么不将变量存储为 a 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 回答