我正在尝试制作一个简单的地图来查找一些数据,但结果很奇怪:
#include "stdafx.h"
#include "atlstr.h"
#include <map>
enum InputTypes { Manual, Automatic, Assisted, Imported, Offline };
struct Params
{
int inputType;
const char* moduleName;
DWORD flag;
};
int _tmain()
{
std::map<CString, Params> options {
{ "Add", { Manual, "RecordLib", 0 } },
{ "Open", { Assisted, "ViewLib", 1 } },
{ "Close", { Imported, "EditLib", 2 } },
{ "Inventory", { Automatic, "ControlLib", 3 } },
{ "Report", { Offline, "ReportLib", 4 } }
};
for (std::map<CString, Params>::iterator iter = options.begin(); iter != options.end(); ++iter)
{
printf("Entry: %s ==> { %d, %s, %d }\n", (const char*)(iter->first),
iter->second.inputType, iter->second.moduleName, iter->second.flag);
}
return 0;
}
输出:
Entry: îþîþîþîþîþîþîþîþîþîþîþîþ[â0; t ==> { 0, RecordLib, 0 }
Entry: Close ==> { 3, EditLib, 2 }
Entry: Inventory ==> { 1, ControlLib, 3 }
Entry: îþîþîþîþîþîþîþîþîþîþîþîþCâ0# t ==> { 2, ViewLib, 1 }
Entry: Report ==> { 4, ReportLib, 4 }
如您所见,一些CString值变为垃圾。 但我认为没有任何理由不能以这种方式创建地图。
这是Microsoft Visual Studio 2013编译器中的错误吗?
我的代码有什么特别之处吗?
############编辑##############
对于那些认为这是CString
的问题的人,我用std::string
重写了它,并且输出更差:
#include "stdafx.h"
#include "atlstr.h"
#include <map>
enum InputTypes { Manual, Automatic, Assisted, Imported, Offline };
struct Params
{
int inputType;
std::string moduleName;
DWORD flag;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::map<std::string, Params> options{
{ "Add", { Manual, "RecordLib", 0 } },
{ "Open", { Assisted, "ViewLib", 1 } },
{ "Close", { Imported, "EditLib", 2 } },
{ "Inventory", { Automatic, "ControlLib", 3 } },
{ "Report", { Offline, "ReportLib", 4 } }
};
for (std::map<std::string, Params>::iterator iter = options.begin(); iter != options.end(); ++iter)
{
printf("Entry: %s ==> { %d, %s, %d }\n", iter->first.c_str(),
iter->second.inputType, iter->second.moduleName.c_str(), iter->second.flag);
}
return 0;
}
输出
Entry: ==> { 0, , 0 }
Entry: Report ==> { 4, , 4 }
请注意,这适用于IDEOne
答案 0 :(得分:3)
我已将您的示例复制到MSVC中。它甚至超过了incorret打印 - 在破坏地图时它是ATL CString中的内存违规。但所有与std :: string一起使用。结论 - 有缺陷的ATL实现。如果我要猜测,我会说,这是移动构造函数中的一个错误。