2011-06-24 4 views
1

Veuillez considérer le code suivant où j'obtiens une violation d'accès en insérant des valeurs dans un objet std :: map. Pas certain de pourquoi. Le code que vous voyez qu'il utilisepointeur vers std :: problème de carte

std::map<int, int> 

cependant, j'ai d'abord essayé

std::map<int, MSGTYPE> 

avec la même violation d'accès résultant. (Je sais que les enums sont des 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; 

Mon utilisation de ces structures ressemble donc:

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

Je n'ai aucune idée de ce que vous voulez dire. – Eric

+5

@Amend, alors s'il vous plaît arrêter de perdre mon temps. – Eric

+6

Je ne vois pas de raison à cet échec. Je soupçonne que du code commenté pourrait corrompre cet objet. - Pour clarifier le commentaire d'Armen: On peut voir une grande influence du style plain-C dans ce C++. En particulier, vous pouvez déclarer 'struct MYOBJ {...};' (sans typedef et nom de fin) avec exactement le même effet en C++. Vous ne pouviez pas faire cela en C. – CygnusX1

Répondre

2

N'a pas ob renversez Compensé avec memset(ob, sizeof(MYOBJ), 0) quelque part après ob = new MYOBJ; et avant l'appel à BuildMsgMap()?

(Puisque le code est héritage et depuis memset astuce est souvent utilisé en C.)

+0

Drôle, vous mentionnez ceci. Vous avez en fait raison! Avant que j'ai posté cela, j'ai effectivement eu un memset juste après le nouveau qui est maintenant commenté. J'ai aussi changé le nouveau MYOBJ en new MYOBJ(); – Eric

0

je pense que depuis mm est une référence aux mm [0], et qui est tout l'allocation de mémoire que vous avez donc pour mm [1] vous devez faire un insert.

ou si vous souhaitez faire

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

espérons que cette aide

+0

l'opérateur d'index de la carte est un T &, pas la paire . Aussi le compilateur ramasserait cela. –

+0

ouais .. corrigé –

0

Je pense que vous obtenez une violation d'accès parce que MyObj n'a pas de constructeur défini, et donc le constructeur de SYSMsgMap n'est pas appelé . Ajoutez un constructeur vide sans argument à MYOBJ et voyez s'il change des choses, par ex.

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