2015-11-05 200 views
3

我试图做一个简单的地图来查找一些数据,但结果出来很奇怪:这是一个编译器错误?难道我做错了什么?

#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

您必须将'CString'对象明确地转换为'LPCTSTR'。尽管如此,最好尽快离开'CString'。 – Chad

+1

@Chad,连同上个世纪的所有省略号废话:D – SergeyA

+0

我已更新我的代码以进行明确的演员表演。但是,同样的问题依然存在。 – abelenky

回答

3

我已将您的示例复制到MSVC中。它甚至不仅仅是打印 - 这是ATL CString在破坏地图时的内存违规。但所有使用std :: string。结论 - 错误的ATL实现。如果我想大胆猜测,我会说,这是移动构造函数中的一个错误。

+0

将我的代码更新为使用printf,并进行了明确的转换以证明该bug仍然存在。 – abelenky

相关问题