0

편집 : 그래서 나는 바보이고 valgrind로 작업 할 때 업데이트 된 .cpp를 SSH하는 것을 잊어 버렸습니다. 어쨌든 새로운 변경 사항을 나타 내기 위해 아래 코드를 업데이트했습니다. 불행히도 나는 여전히 아래에있는 것들로 누출되는 일부 정보를 얻고 있으며, 내가하고있는 일은 어떤 정보가 여전히 제대로 삭제되지 않는 것을 의미하는 나무를 만드는 것이다.메모리 누수가 있기 때문에 내 소멸자가 트리의 모든 노드에 충돌하는 것처럼 보이지 않습니다. 무엇을 놓치고 있습니까?

여기 재귀 도우미를 호출하는 내 트리의 내 소멸자입니다.

struct Node { 
    NodeData* data; // pointer to data object 
    Node* left; // left subtree pointer 
    Node* right; // right subtree pointer 
}; 

NODEDATA가 제대로 작동 자신의 소멸자가있는 별도의 객체 클래스입니다 :

//---------------------------- destructor -------------------------------- 
BinTree::~BinTree() { 
    makeEmptyHelper(root); 
} 

//---------------------------- makeEmptyHelper -------------------------------- 
void BinTree::makeEmptyHelper(Node*& current) { 

    if (current != NULL) { 
     makeEmptyHelper(current->left); 
     makeEmptyHelper(current->right); 
     delete current->data; 
     delete current; 
     current = NULL; 
     //delete current; 
    } 
} 

여기 내 노드 구조체이다.

+0

어딘가에 데이터를 삭제 하시겠습니까? 나는 당신이 current-> data; 삭제를 주석 처리했다는 것을 의미한다. 아마도 노드의 소멸자가 그 일을합니다. 편집 :하지만 노드에는 소멸자가 없습니다. – drescherjm

+0

깨달았습니다 업데이트 된 .cpp를 그냥 사용하지 않았기 때문에 바보입니다. 매번 같은 코드를 실행했기 때문에 주석 달기와 주석 처리에서 아무런 영향을주지 않는다고 생각했습니다 .- 주석 처리를 해제했습니다. 저것은 누수의 일부를 확실히 고쳤습니다. –

답변

4

나중에 NULL으로 설정하기 전에 current을 삭제해야합니다. 실제로 currentNULL으로 설정해야 할 이유가 없습니다. 포인터 current이 값으로 전달되므로 업데이트하면 외부 효과가 없습니다.

delete NULL에는 적합하지만 아무 조작도하지 않습니다.

+0

어쨌든'current = NULL; '을 제거 할 수있을 것입니다. 그것은 포인터의 로컬 복사본을 nulling하는 것입니다. –

+0

사실, 나는 그것을 더할 것이다. – comingstorm

+0

예 죄송합니다. 이전에 참조로 전달 했든 값으로 전달 했든간에 차이가 있는지 먼저 살펴 보았습니다. 나중에 내 코드에서 트리를 가로 지르는 동안 NULL을 치는 것에 의존하기 때문에 참조로 전달하려고합니다. 따라서이 경우에는 current = NULL을 원하고 참조로 전달하기 위해 다시 변경했습니다. –