2013-11-15 4 views
0

클래스 HashMap이 있는데 모든 것이 잘 작동하는 것처럼 보입니다. 그러나 memoryleaks에 문제가 있습니다. 내가 노드의 배열을 가리키는 bucketList 포인터가C++ 클래스 삭제 (valgrind check)

HashMap::HashMap() 
    :hashfunction(hash), bucketList(bucketList = new Node*[INITIAL_BUCKET_COUNT]), numberOfPairs(numberOfPairs = new int[INITIAL_BUCKET_COUNT]), 
    logins(0),lengthOfMap(INITIAL_BUCKET_COUNT) 
{ 
    for(int i = 0; i < INITIAL_BUCKET_COUNT; i ++) 
    { 
     bucketList[i] = nullptr; 
    } 
    zeroFillArray(numberOfPairs, INITIAL_BUCKET_COUNT); 
} 

, 각 : 아래

내 HashMap의 클래스의 private 멤버 변수/함수

struct Node 
    { 
     std::string key; 
     std::string value; 
     Node* next; 
    }; 

    HashFunction hashfunction; 
    Node** bucketList; 
    int* numberOfPairs; 
    int logins; 
    int lengthOfMap; 

그리고 여기 내 기본 생성자되어 있습니다 노드는 링크 된 목록의 시작을 가리 킵니다. 지금 현재로

이 내 소멸자이다 : 나는 각 노드를 삭제 마십시오
HashMap::~HashMap() 
{ 
    delete numberOfPairs; 
    delete bucketList; 
} 

(나는 아침에이 문제를 해결할 것입니다,하지만 난 상관없이 물어보고 싶은게) 나는 목록을 삭제하기 전에 목록에서 , 아니면 완전히 다른 것을 놓치고 있습니까?

+0

왜 Valgrind가 생산 한 진단을 읽고 이것을 직접 파악하지 않습니까? –

+0

예, 각 노드를 삭제합니다. 포인터는 스스로를 삭제하지 않습니다. – john

답변

3
HashMap::~HashMap() 
{ 
    for(int i = 0; i < INITIAL_BUCKET_COUNT; i ++) 
    { 
     Node* node = bucketList[i]; 
     while(node != nullptr) 
     { 
      Node* next = node->next; 
      delete node; 
      node = next; 
     } 
    } 
    delete numberOfPairs; 
    delete[] bucketList; 
} 
+0

그러면 bucketList [i]에서 첫 번째 노드를 가리키는 각 포인터가 삭제됩니까? 이것은 첫 번째 노드 포인터를 삭제하지 않고 연결된 목록 만 삭제하는 것처럼 보입니다. – LeoVannini

0

bucketList에서 모든 노드를 수동으로 삭제할 수 있습니다. manualy라고하면 모든 노드를 던져서 삭제해야한다는 의미입니다. 다음과 같이하십시오 :

HashMap::~HashMap() 
{ 
    for(int i = 0; i < INITIAL_BUCKET_COUNT; ++i) 
    { 
     if(bucketList[i]) 
     { 
      Node* first = bucketList[i]; 
      while(first) 
      { 
       Node* temp = first->next; 
       delete first; 
       first = temp; 
      } 
     } 
    } 
    delete[] bucketList; 
    delete numberOfPairs; 
}