2012-01-07 3 views
0

프로젝트를 실행할 때 세그먼트 화 오류가 발생합니다. 메인의 끝에서 Btree 클래스의 소멸자가 실행되면 Node 클래스의 소멸자가 호출됩니다. 그런 다음 Word 클래스의 소멸자 호출에서 오류가 발생합니다. 그리고 list.tcc(~Btree -> ~Node() -> ~Word() (error): list.tcc:)소멸자의 분할 오류

커서가이 라인에 오류가 있습니다 열립니다

list.tcc:

_Node* __cur = static_cast<_Node*>(this->_M_impl._M_node._M_next); 

이 오류의 이유 Word 클래스의리스트인가?

클래스의 코드는 다음과 같이 축약 :

class Btree{ 
private: 
... 
Node *root; 
... 
public:... 
~Btree(){delete[] root;}; 

}; 

class Node{ 
... 
Word *words; 
Node **children; 
... 
    ~Node(){delete [] words; delete []children;}; 
}; 

class Word{ 
public: 
string word; 
list<Couple> couple; 

    Word(){}; 
    ~Word(){}; 
}; 

class Couple{ 
... 
public: 
.... 
    ~Couple(){}; 
}; 
+1

배열이 아닌 포인터에 대해 delete []를 원합니까? 아니면 배열입니까? – Linuxios

+0

필드'std :: vector 루트를 선언하지 않는 이유는 무엇입니까 '??? –

+0

'valgrind'와'gdb'를 사용하여 코드를 디버깅 했습니까?'g ++ -Wall -g'로 컴파일 했습니까? (리눅스를 사용한다고 가정) ?? –

답변

1

어떻게 당신이 당신의 root을 할당 했습니까? 내 개인적인 생각 엔 당신은 정의되지 않은 동작을 얻을 것이다, 당신이 배열 객체로 배열이 아닌 객체의 할당을 해제하려고하면 당신이

root = new Node(); 

를 사용하여 할당하는 것이 될 것이다. 실제로 노드의 시작 전에 단어를 취해 그것이 요소의 수이고 그 수의 요소를 파괴한다고 가정합니다. 너무 잘 작동하지 않는 한 가지가 있기 때문에. 당신은 아마

delete root; 
+0

감사합니다. 그것은 효과가 있었다. –