C++ violation d'Accès?
Pourquoi suis-je une violation d'accès de lecture de l'emplacement 0xC0000005 ici si le même code fonctionne comme un charme quand je le codage en linux?
if(nodo->izq!=NULL) //nodo is a class or struct and "sig" is a pointer of the same kind
VaciarAux(nodo->izq);
Est-il possible de le remettre sans exception non gérée?
affirmer fera l'affaire?
ici est la fonction
void Arbol<T>::VaciarAux(Nodo<T> * &nodo)
{
if(nodo->izq!=NULL)
VaciarAux(nodo->izq);
if(nodo->der!=NULL)
VaciarAux(nodo->der);
if(nodo->izq == NULL && nodo->der ==NULL)
{
actual = nodo;
nodo=NULL;
delete actual;
contador--;
}
assert
est un test de cohérence pour votre programme. Toutes les vérifications effectuées à l'aide deassert
sont censés être même pas présent dans le code de production. Vous êtes probablement en train de lire unintialized mémoire quelque part, donc votre NULL vérifier passe, mais ensuite vous arrivez dans la mémoire vive domaines. Toutefois, vous devriez publier plus de code pour les aider à évaluer votre problème.- Il n'y a pas assez d'informations dans votre question nécessaire pour une réponse adéquate. La violation d'accès peut être pour une raison quelconque.
- Qu'entendez-vous par "faire valoir fera l'affaire"? Toujours être très précis quand vous poser des questions.
- J'ai défini comme NULL 0 à l'en-tête. Cette fonction est récursive, ce qu'il fait est pour le nettoyage d'un arbre
Vous devez vous connecter pour publier un commentaire.
La plus probable, car
nodo
lui-même est un pointeur non valide. Le->
déréférencement serait alors poser un problème.Vous avez besoin de vérifier les choses qui pourraient éventuellement affecter cette valeur (dépassements de la mémoire tampon causant la corruption, ayant la valeur NULL pour une certaine raison).
Noter que:
ne pas vérifier si le
nodo
variable est NULL, mais plutôt si leizq
membre de cenodo
points est NULLE.Si vous voulez tout simplement à ne rien faire si
nodo
lui-même est NULLE, vous pourriez le mettre au début:mais je pense toujours que vous seriez beaucoup mieux remonter à la source du problème plutôt que de simplement la fixation d'un symptôme.
Je pense que le problème est avec la façon dont vous traitez l'arbre. Vous êtes effectivement en train de faire:
Le principal problème, c'est qu'à
delTree (node.left)
signifie que vous obtiendrez exactement le problème que vous voyez si l'arbre est vide depuis la première chose que vous essayez de faire est de déréférencer le NULL nœud racine.La plus habituelle de l'approche est d'abord de reproduire les enfants inconditionnellement (avec une valeur NULL protecteur) puis traiter le nœud lui-même, quelque chose comme:
Cela permettra de gérer correctement un arbre vide et encore supprimer correctement tous les enfants avant les parents. Et il semble plus élégant, qui est l'une des raisons pour utiliser la récursivité en premier lieu 🙂
Je vais le laisser comme un exercice pour le lecteur à tourner que dans C++.
nodo
,izq
,der
etcontador
. Jusqu'au point que vous avez dit que vous étiez la suppression d'un arbre, le code n'a pas de sens pour moi. Je suppose que je devrais avez juste vérifié Google Translate et il m'aurait donné le espagnol->traduction en anglais. Mais il est intéressant, il refuse de traduire "der", insistant sur le fait que l'anglais "droit" est "droit".delTree(node.left)
ne permet pas de définirnode.left
à NULL, mais comme c'est en passant le pointeur par référence, et il a fait unnode = NULL;
lors de la suppression du nœud, ne devrait pas affecter la valeur de lanode.left
dans le précédent appel récursif?&
se cachait de moi, j'en suis sûr 🙂 j'ai enlevé le erronée partie de la réponse.Comme pax dit que c'est probablement un mauvais pointeur. Sous Linux il y a peut-être pas strict de la mémoire virtuelle règles que lors de l'exécution du code à un autre endroit, aussi dépend du compilateur). Ainsi, dans le Linux cas, il peut être un travail, mais il pourrait en fait être en train de faire quelque chose que vous n'attendiez pas.
Vous voudrez peut-être chercher dans la façon dont vous êtes la création d'un
Nodo
type (c'est à dire, de regarder son constructeur par défaut ... il devrait en avoir un puisque c'est un class/struct qui contient des pointeurs). Par exemple, si vous n'êtes pas initialiser les membres d'uneNodo
type de sorte que les deux pointeur membres sont initialementNULL
chaque fois qu'unNodo
objet est créé, alors qu'ils auraient pu tout indeterminant valeur, tels que les tests pourNULL
des valeurs à l'intérieur deArbol<T>::VaciarAux
échouera. Par exemple, un nouveauNodo
allait se retrouver avec des pointeurs initialisé à certaines valeur aléatoire, mais ceux aléatoire les valeurs de la mémoire contenue dans le pointeur-membres deNodo
ne sont pas valides des endroits accessibles en mémoire. Puis, quand vous testez si les pointeurs sontNULL
, le résultat est faux, et vous essayez de déréférencement dans le prochain appel récursif àArbol<T>::VaciarAux
, ce qui provoque une violation d'accès.