0xC0000005: violation d'Accès lecture de l'emplacement 0x00000004

Mon problème est que je suis en face d'erreur "exception non Gérée à 0x00bd3364 dans qualnet.exe: 0xC0000005: violation d'Accès lecture de l'emplacement 0x00000004.".

Le scénario, c'est que je l'ai défini une structure (NodesInfoTable) qui est utilisée dans une autre structure (Nœud). Veuillez noter que je suis en utilisant ce code dans un simulateur de réseaux QualNet. Je suis d'erreur à chaque fois que j'execute mon code dans le simulateur de réseaux. Cependant, si j'execute mon code dans un autre projet (projet de test) qui sont constitués uniquement de ce code, ce code s'exécute correctement.

Je pense qu'il y a un problème avec l'allocation de la mémoire. Mais je me demande pourquoi il fonctionne correctement dans un projet, mais pas dans l'autre.

J'ai aussi cherché sur d'autres post avec un titre semblable, mais leur problème est différent. C'est pourquoi, j'ai utilisé le nouveau post pour mon enquête.

Mon code est fourni ci-dessous:

fichier: nœud.h

struct NodesInfoTable {
    int nodeId;
    int nodeStatus;
    list<int> channels;
};


struct Cluster {
    int clusterId;
    list<int> commonChannels;
    Cluster() {
        clusterId= -1;
    }
};



struct Node {
    int var1;
    int var2;
    Cluster* cluster;
    list<NodesInfoTable*> nodeTable;
};

fichier: node.cpp

Node* newNode;
newNode = (Node*) MEM_malloc(sizeof(Node));
.....
newNode->cluster = new Cluster();
newNode->nbTable = ??
....

fichier: myfile.cpp

NodesInfoTable nbTable1; 
nbTable1.nodeId = 1;
nbTable1.nodeStatus = 2;
node->nbTable.push_back(nbTable1); //'node' object is available here

J'obtiens l'erreur:

Exception non gérée à 0x00bd3364 dans qualnet.exe: 0xC0000005: violation d'Accès lecture de l'emplacement 0x00000004.

en ligne:

noeud->nbTable.push_back(nbTable1);

Et le débogueur naviguer sur moi pour le code _Nodeptr _Newnode = _Buynode(_Pnode, _Prevnode(_Pnode), _Val); dans le fichier: liste. Certains états au-dessus et au-dessous de ce code sont également mentionnées ci-dessous:

_Nodeptr _Pnode = _Where._Mynode();
_Nodeptr _Newnode = _Buynode(_Pnode, _Prevnode(_Pnode), _Val);
_Incsize(1);
_Prevnode(_Pnode) = _Newnode;
_Nextnode(_Prevnode(_Newnode)) = _Newnode;

S'il vous plaît pas que je suis bien accédant à "cluster" de l'objet par le biais de "nœud" de l'objet. Cependant, le problème est avec "nbTable'. Depuis que j'ai utilisé déclaration newNode->cluster = new Cluster(), je pense que c'est pourquoi, la mémoire est allouée à cet objet. Mais je n'ai pas idée de comment dois-je gérer newNode->nbTable = ?? parce que je pense que c'est le problème.

Vous en remercie d'avance et j'ai hâte vers la solution.

  • Et node n'est pas zéro?
  • Aussi, nbTable ou nodeTable? Et notez que nodeTable est un vecteur de pointeurs pendant que vous poussez en arrière une valeur qui n'est pas un pointeur. Cependant, cela n'aurait même pas compiler... Alors s'il vous plaît poster réel et le code de travail. S'il vous plaît apprendre comment créer un un Minimum, Complètes et Vérifiables exemple.
  • Ce qui sur terre est MEM_malloc et pourquoi n'utilisez-vous pas new ici ??? Comment voulez-vous que les constructeurs d'être appelé si vous faites cela ?
  • Pourquoi avez-vous allouer Node avec MEM_malloc et Cluster avec new? Pourquoi n'utilisez-vous pas new pour toutes les allocations de tas?
  • à tout moment vous avez une violation d'accès frapper une adresse à une certaine valeur (généralement une puissance de 2) compensation de 0x00000000, il est presque assuré que vous êtes un déréférencement d'un pointeur NULL (plus précisément,un membre de la variable par l'intermédiaire d'un pointeur null, dans ce cas, 4 octets sur ce que la structure est). Maintenant, cela dit, arrêter malloc'ing dans le code C++, sauf si vous sérieusement savez ce que vous faites.
  • Je vous remercie pour votre réponse. Oui, node n'est pas nul et nodeTable est en fait nbTable. Désolé, c'est une erreur. Le code compile correctement. En fait, je souhaite savoir comment je peux faire new pour la liste des struct newNode->nbTable? (c'est à dire comme je l'ai fait pour newNode->cluster).
  • Merci pour votre commentaire. Je suis confus que comment puis-je utiliser new pour list<NodesInfoTable*>. Si il serait simple NodesInfoTable* alors je peux facilement utiliser new NodesInfoTable() comme je l'ai fait pour cluster.
  • En fait, je suis à l'aide de simulateur de réseaux, de sorte MEM_malloc est par défaut utilisé dans le simulateur. J'ai utilisé new pour les nouvelles structures qui je suis en train d'élaborer pour mon travail.
  • Merci pour votre explication détaillée. J'ai aussi ne veux pas utiliser malloc. Au lieu de cela je veux utiliser new mais je suis confus que comment puis-je l'utiliser de nouveau pour list<NodesInfoTable*>. Si il serait simple NodesInfoTable* alors je peux facilement utiliser new NodesInfoTable() comme je l'ai fait pour cluster.

InformationsquelleAutor Yasir Saleem | 2014-03-28