2014-03-12 5 views
0

예를 들어, 여러 컬렉션의 ptrs 배열을 보유하는 라이브러리 클래스가 있습니다.ptrs 배열을 올바르게 삭제하는 방법은 무엇입니까? 내 소멸자는 실제 객체가 누락 된 것 같습니다.

ContentCollection** contents; 

그러나 내 삭제는 실제 모음 (이 경우 나무)을 맞출 수없는 것 같습니다.

ContentCollection::~ContentCollection() { 
    deleteHelper(root); //Deletes Contents 
} 

//----------------------------------------------------------------------------- 
//Deletes stored Contents 
void ContentCollection::deleteHelper(Node* curr) { 
    if (curr != NULL) { 
     deleteHelper(curr->left); 
     deleteHelper(curr->right); 
     delete curr->data; 
     curr->data = NULL; 
     delete curr; 
    } 
} 

내가 꽤 분명 잘못 내 기억의 거의 아무것도 해제하지 뭔가를하고 있어요 : 여기

Library::~Library() { 
    //Delete stored ContentCollections 
    for (int i = 0; i < POTENTIALCONTENTTYPES; i++) { 
     delete contents[i]; 
     contents[i] = NULL; 
    } 

    delete[] contents; 
} 

내가 큰 실수를 대비해서 나무에서 소멸자이다.

+0

왜 모든 것이 포인터입니까? – chris

+0

포인터의 배열을 가지고 있다면 배열을 걸어서'free (ptr)'라고 말한 다음 그 배열이 걸어 오면'free (array_ptr);' – Fallenreaper

+0

@Fallenreaper가 아니라'free'가됩니다. 'delete'. 'free'는'malloc'으로 할당 된 메모리를위한 것입니다 (실제로 사용하지 않기를 바랬습니다). – chris

답변

2

ContentCollection**std::vector<std::unique_ptr<ContentCollection>>으로 바꾸십시오. 그러면 더 이상 delete 초를 걱정할 필요가 없습니다.

ContentCollection은 추상적 인 기본 클래스라고 가정합니다. 그런 다음 destructor은 가상이어야합니다. 그렇지 않으면 한 단계의 간접 참조를 버리고 std::vector<ContentCollection>을 사용할 수 있습니다.

+0

나는 이터레이터를 가지고 다니기 위해 벡터를 사용하지 않기를 바랬다. 돌아가서 필요로하는 모든 장소에서 디자인을 변경하는 것을 피하고 싶습니다. ContentCollection은 내가 추상적으로 명명 한 BST입니다. –

+0

@ MilanNovaković, 당신은'ContentCollection'을 [multi] 세트로 만드는 것을 고려할 수 있습니다. 거의 BST이지만 조금 더 효율적입니다. 그래도 이터레이터가 어떻게 영향을 미치는지는 잘 모르겠습니다. 'std :: vector'의 무작위 접근 반복자는 포인터처럼 사용될 수 있습니다. 실제로, 그들은 아마 * 포인터입니다. – chris

+0

반복기를 사용할 필요가 없다면 아무런 비용이 들지 않습니다. – fredoverflow