2017-09-07 10 views
-2

저는 C++의 초보자입니다. Quadtrees의 수정 된 버전을 생성하는이 코드를 작성했습니다. .,C++에서 "액세스 위반 읽기 위치"오류가 발생했습니다.

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

delete_helper 기능 :

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

과 :

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

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

tree_builder 기능 내가 그것을 실행하면, 나는 "액세스 위반 읽기 위치"오류가 나는 두 개의 클래스가 그것이 내가 오류를 얻는 곳입니다 :

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

주 :

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

P.S. 죄송합니다. 코드가 길어서 가능한 한 짧게하려고했습니다.

+1

[MCVE]를 제공해주십시오. 짧은 예제는 훌륭하지만 설명 된 오류가 계속 발생할 수있는 경우에만 가능합니다. 문제의 원인을 추론 할 수있는 정보가 부족합니다. –

+0

예외의 호출 스택은 무엇입니까? –

+0

'p-id '를 네 번 삭제하는 이유는 무엇입니까? –

답변

1

p-> id를 네 번 삭제합니다.

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

또 다른 잠재적 인 문제는 자식 배열이 0으로 초기화되지 않았기 때문에 초기화되지 않은 자식을 삭제하는 것입니다. 모든 노드에 4 개의 유효한 자식이 있는지 확인하십시오.

+0

당신이 옳았고 고칠 수 있는데, 이것은 문제를 일으킬 수 있습니다. 그러나 for 루프 이후에 삭제하더라도 동일한 오류가 발생합니다! – Mohammad

+0

질문을 편집하면 답변이 무효화됩니다. 문제가 여전히 발생하고 있으므로 모든 노드에 네 명의 자녀가 있다고 확신합니까? 초기화되지 않은 어린이를 삭제할 가능성이 있습니까? –

+0

예, 모든 노드에는 네 개의 자식이 있습니다. delete_helper가 삭제하는 유일한 장소입니다. – Mohammad