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
ounodeTable
? Et notez quenodeTable
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 pasnew
ici ??? Comment voulez-vous que les constructeurs d'être appelé si vous faites cela ? - Pourquoi avez-vous allouer
Node
avecMEM_malloc
etCluster
avecnew
? Pourquoi n'utilisez-vous pasnew
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 etnodeTable
est en faitnbTable
. Désolé, c'est une erreur. Le code compile correctement. En fait, je souhaite savoir comment je peux fairenew
pour la liste des structnewNode->nbTable
? (c'est à dire comme je l'ai fait pournewNode->cluster
). - Merci pour votre commentaire. Je suis confus que comment puis-je utiliser
new
pourlist<NodesInfoTable*>
. Si il serait simpleNodesInfoTable*
alors je peux facilement utilisernew NodesInfoTable()
comme je l'ai fait pourcluster
. - 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 utilisernew
mais je suis confus que comment puis-je l'utiliser de nouveau pourlist<NodesInfoTable*>
. Si il serait simpleNodesInfoTable*
alors je peux facilement utilisernew NodesInfoTable()
comme je l'ai fait pourcluster
.
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas validé, mais les commentaires fondamentalement le préciser.
Vous avoir la structure suivante:
Qui vous avez réservé avec:
Je ne sais pas exactement ce que
MEM_malloc
, mais la fonte insulte que quelque chose, probablement unvoid*
est emballé à unNode*
. Si vous regardez laNode
structure que vous avez unlist<NodesInfoTable*>
, ce qui est probablement unstd::list
, qui est un classe.Comme nous le savons tous, les classes ont besoin de leurs constructeurs à exécuter avant de pouvoir être utilisé correctement. L'allocation de la mémoire brute et de la coulée, il ne sera pas comme par magie exécuter le constructeur.
Si vous voyez une classe quelque part, l'utilisation de nouvelles!
Comme une règle de base que vous devez utilisé
new
etdelete
avec C++. (Si vous savez exactement ce que vous faites, les exceptions peuvent s'appliquer).list<NodesInfoTable*> nbTable ;
C'est pourquoi, j'étais incapable de fairenew
, c'est à dire,newNode->nbTable = new list<NodesInfoTable>();
Cependant, sa syntaxe est:list<NodesInfoTable>* nbTable;
Alors, maintenant, je peux facilement fairenewNode->nbTable = new list<NodesInfoTable>();
et le code fonctionne bien.