2011-06-24 101 views
1

請考慮下面的代碼,在這裏我得到一個將值插入std :: map對象的訪問衝突。不知道爲什麼。如您所見,該代碼使用指向std :: map的指針

std::map<int, int> 
然而

,我最初試圖

std::map<int, MSGTYPE> 

具有相同導致訪問衝突。 (我知道枚舉是INT)。

// a common include file has this 
// common.h 

enum MSGTYPE 
{ 
    MSG_R1, 
    MSG_A1, 
    MSG_L1, 
    MSG_S1, 
    MSG_S2 
}; 

typedef std::map<int, int> SYSMsgMap; 

typedef struct _MYOBJ 
{ 
    int x1; 
    int x2; 
    SYSMsgMap XFerMap; 
}MYOBJ; 

我的這些結構的使用看起來像這樣:

MYOBJ *cMYOBJ::AddNetwork(cvnet *net) 
{ 
MYOBJ *ob; 

    ob = new MYOBJ(); 

    // initialization code removed for this post/brevity 

    BuildMsgMap(ob->XFerMap); 

    // rest removed for this post/brevity 
} 

void cMYOBJ::BuildMsgMap(std::map<int, int> &mm) 
{ 

    mm.clear(); 

    switch(NETTYPE) 
    { 
    case 1: 
     mm[ 1] = MSG_R1; <-- Access violation here! 
     mm[ 2] = MSG_A1; 
     mm[ 4] = MSG_L1; 
     mm[16] = MSG_S1; 
     mm[32] = MSG_S2; 
    break; 

// rest removed... 
} 
+0

我不知道你的意思。 – Eric

+5

@修改,所以請不要浪費我的時間。 – Eric

+6

我沒有看到失敗的原因。我懷疑一些註釋掉的代碼可能會破壞這個對象。 - 澄清Armen的評論:在這個C++中可以看到純C風格的巨大影響力。特別是你可以在C++中聲明'struct MYOBJ {...};'(沒有typedef和尾部名稱),它的效果完全相同。您無法在C中執行此操作。 – CygnusX1

回答

2

ob因意外與memset(ob, sizeof(MYOBJ), 0)清除ob = new MYOBJ;後調用BuildMsgMap()在什麼地方?

(由於代碼是遺留並且由於memset特技通常在C.使用)

+0

有趣的你提到這一點。你其實是對的!在我發佈這個之前,我確實有一個memset,現在已經被註釋掉了。我也將新的MYOBJ更改爲新的MYOBJ(); – Eric

0

我想,因爲毫米是到毫米[0]的基準,這是你已經得到了所有的存儲器分配 因此對於mm [1],您需要執行插入操作。

,或者你想要做

ob = new MYOBJ[33];//since you have indexed mm[32] in the next function 

希望這有助於

+0

地圖的索引運算符是T&,而不是對。編譯器也會選擇它。 –

+0

是的..糾正 –

0

我覺得你得到一個訪問衝突,因爲MyObj中沒有定義的構造,因此SYSMsgMap的構造是沒有得到所謂的。向MYOBJ添加一個空的無參數構造函數,看它是否改變了一些東西,例如

typedef struct _MYOBJ 
{ 
    _MYOBJ() {} 
    int x1; 
    int x2; 
    SYSMsgMap XFerMap; 
}MYOBJ;