2017-09-07 8 views
-2

Je suis un débutant en C++. J'ai écrit ce code qui génère une version modifiée de Quadtrees. . Quand je lance, je reçois la « violation d'accès emplacement de lecture » erreur j'ai deux classes:Erreur de "violation d'accès de lecture d'accès" sur C++

class TreeNode 
{ 
public: 
    TreeNode *parent; 
    TreeNode *child[4]; 
    int *id; 
    ... 
TreeNode(..., int *_id, ...): ..., id(_id),... {} 
    }; 

et:

class QuadTree 
{ 
private: 
    ... 
    TreeNode *root; 
    void tree_builder(TreeNode *&p,...); 

public: 
    QuadTree(...); 
    ~QuadTree() {delete_helper(root);} 
}; 

fonction tree_builder:

void QuadTree::tree_builder(TreeNode *&p, ...) 
{ 
    p = new TreeNode(); 
    p->id = new int[2 * length]; 
    ... 
} 

fonction delete_helper, c'est là que j'obtiens l'erreur:

void QuadTree::delete_helper(TreeNode *& p) 
{ 
    if (p != NULL) 
    { 
     for (int i = 0; i < 4; i++) 
     { 
      delete_helper(p->child[i]); 
     } 
     delete[] p->id; 
     delete p; 
     p = NULL; 
    } 
} 

principal:

int main() 
{ 
    QuadTree *tree; 
    tree = new QuadTree(length, xyseed); 
    ... 
     delete tree; 
    ... 
     return 0; 
} 

P.S. Désolé mon code est long, j'ai essayé de le rendre aussi court que possible!

+1

Veuillez fournir un [MCVE]. Un petit exemple est génial, mais seulement s'il peut encore produire l'erreur décrite. Il n'y a pas assez d'informations dans votre exemple pour déduire la source du problème. –

+0

Quelle est la pile d'appel de l'exception? –

+0

Pourquoi supprimez-vous 'p-> id' quatre fois? –

Répondre

1

Vous supprimez p-> id quatre fois.

for (int i = 0; i < 4; i++) 
{ 
    .... 
    delete[] p->id; 
} 

Un autre problème potentiel est la suppression des enfants non initialisés car la matrice enfant n'est pas initialisée à 0s. Êtes-vous sûr que chaque noeud a quatre enfants valides?

+0

Vous avez raison et je l'ai réparé, cela peut causer un problème; Cependant, même si je le supprime après la boucle for, j'obtiens la même erreur! – Mohammad

+0

Si vous modifiez la question, vous invalidez les réponses. Puisque le problème persiste, êtes-vous sûr que chaque nœud a quatre enfants? Êtes-vous en train de supprimer un enfant non initialisé? –

+0

Oui, chaque noeud a quatre enfants. Et le delete_helper est le seul endroit qui supprime. – Mohammad