2017-09-07 3 views
-2

Ich bin ein Anfänger in C++. Ich habe diesen Code geschrieben, der eine modifizierte Version von Quadtrees erzeugt. . Wenn ich es laufen, ich habe die „Zugriffsverletzung Leseort“ Fehler angezeigt Ich habe zwei Klassen:"Zugriffsverletzung Leseort" Fehler auf C++

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

und:

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

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

tree_builder Funktion:

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

delete_helper Funktion, das ist, wo ich den Fehler bekomme:

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; 
    } 
} 

Haupt:

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

P.S. Sorry mein Code ist lang, ich habe versucht, es so kurz wie möglich zu machen!

+1

Bitte geben Sie einen [MCVE] an. Ein kurzes Beispiel ist großartig, aber nur, wenn es immer noch den beschriebenen Fehler erzeugen kann. In Ihrem Beispiel gibt es nicht genügend Informationen, um auf die Ursache des Problems zu schließen. –

+0

Was ist der Call-Stack der Ausnahme? –

+0

Warum löschen Sie 'p-> id' viermal? –

Antwort

1

Sie löschen viermal p-> id.

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

Ein anderes mögliches Problem ist das Löschen nicht initialisierter untergeordneter Elemente, da das untergeordnete Array nicht auf 0s initialisiert wird. Sind Sie sicher, dass jeder Knoten vier gültige Kinder hat?

+0

Sie haben Recht und ich habe es behoben, das kann ein Problem verursachen; Aber selbst wenn ich es nach der for-Schleife lösche, bekomme ich den gleichen Fehler! – Mohammad

+0

Wenn Sie die Frage bearbeiten, machen Sie die Antworten ungültig. Da das Problem immer noch auftritt, sind Sie sicher, dass jeder Knoten vier Kinder hat? Löschen Sie möglicherweise ein nicht initialisiertes Kind? –

+0

Ja, jeder Knoten hat vier Kinder. Und der delete_helper ist der einzige Ort, der gelöscht wird. – Mohammad

Verwandte Themen