添加两个LPCWSTR变量

时间:2013-10-21 05:56:41

标签: c++ concatenation lpcwstr

我正在尝试添加两个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变量变成了一个完全随机的东西,一堆似乎是阿拉伯符号的东西。

有人能指出我做正确的方向吗?正如我所说,函数似乎工作正常,就在我通过断点返回到我的项目时,变量等于完全不同的东西

3 个答案:

答案 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());