2015-11-05 56 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

相關問題