2

我有一个const std::map<const wchar_t*, const char*>在全局命名空间中。它看起来像这样:

.h 文件

typedef std::map<const wchar_t*, const char*> ShaderMap;

const ShaderMap::value_type rawShaderData[] = {
    ShaderMap::value_type( L"BasicShader_Vertex", 
        "..."
    ),
);

const int ElementCount = 2; //Length of rawShaderData
extern ShaderMap ShaderProgramsMap;

.cpp 文件

ShaderMap ShaderProgramsMap = ShaderMap( rawShaderData, rawShaderData + ElementCount );

我试图在我的代码中的其他地方访问它,如下所示:

std::wstring shaderKey = std::wstring( name + L"_Vertex" );
...
pShaderData = ShaderProgramsMap[shaderKey.c_str()];

使用调试器,shaderKey是“BasicShader_vertex”,但pShaderData为 NULL。比较std::wstring::c_strto的值有问题const wchar_t*还是代码中的其他地方有问题?

4

2 回答 2

5
std::wstring shaderKey1 = std::wstring( name + L"_Vertex" );
ShaderProgramsMap[shaderKey1.c_str()] = "Whatever";

std::wstring shaderKey2 = std::wstring( name + L"_Vertex" );
pShaderData = ShaderProgramsMap[shaderKey2.c_str()];

返回的指针shaderKey1.c_str()shaderKey2.c_str(). 它们是 2 个不同的字符串,它们都分配了自己的数据并为您提供了指向该分配的指针。它们碰巧存储了相同的数据,但您只查看指针。如果要按字符串搜索和排序,请将键设为 a std::wstring,而不是 a const wchar_t*。同样,该值也很可能是std::string, not const char*,但我会让你决定。

您原始方法的另一个问题是,shaderKey.c_str()一旦shaderKey超出范围,返回的指针就会悬空。

于 2013-05-15T20:21:27.073 回答
1

在您的示例代码中,我实际上没有看到 std::map —— 我看到了一个 std::map<>:: value_type元素数组(即 const char*)。

所以, const ShaderMap::value_type ShaderProgramsMap[] = { ... };

实际上是: std::pair<wchar_t const* const, char const*> const ShaderProgramsMap[] = { ... }

和, pShaderData = ShaderProgramsMap[shaderKey.c_str()];

实际上是:

int nArrayIndex = int(shaderKey.c_str());
pShaderData = ShaderProgramsMap[nArrayIndex]; // actually an array, not a map
于 2013-05-15T20:54:27.653 回答