2014-09-29 1 views
0

저는 C++를 배우고 Hash 클래스를 작성하려고합니다. 지금까지는 프로그램이 해시 클래스를 사용하여 끝났을 때 내 해시 테이블과 관련된 메모리 누수가 있다는 사실을 제외하고는 모든 것이 훌륭하게 작동합니다. 힙에 저장된 요소를 삭제할 소멸자를 작성하는 데 도움이되기를 바랍니다.C++에서 특정 해시 클래스에 대한 메모리 할당을 해제하는 소멸자

여기 내 hashclass.h 파일입니다 :

class Hash { 
public: 
    Hash(); 
    /* Bunch of methods here*/ 
    virtual ~Hash(); 
private: 
    static const int size = 20; 

    struct item{ 
     string name; 
     int number; 
     item* next; 
    }; 

    item* HashTable[size]; 

}; 

그리고 내 hashclass.cpp에 내 생성자에 대한 다음과 같은 구현이 :

Hash::Hash(){ 
    for (int i = 0; i < size; i++) { 
     HashTable[i] = new item; 
     HashTable[i]->name = ""; 
     HashTable[i]->number = 0; 
     HashTable[i]->next = NULL; 
    } 

} 

사람이 적절한를 작성하는 방법을 설명 할 수 있을까를 이 해시 테이블을 작성하는 데 사용되는 모든 메모리 블록의 할당을 해제하는 소멸자.

+1

소멸자를 제외하고 왜 초기 할당 배열의 각 슬롯에 동적 할당을 준비하고 있습니까? 그 슬롯에있는'nullptr'는 노드 - 투 - 아무데도 "아무것도 없습니다"를 나타내는 것보다 적절합니다. 'item'은 매개 변수화 된 생성자가 필요합니다. 처음에 저장할 데이터가있을 때만 필요하다는 것을 알아야합니다. – WhozCraig

+0

이 정보를 사용하여 메모리를 할당 해제 할 소멸자를 빌드하는 방법을 자세히 설명해 주시겠습니까? 나는이 것들에 관해서 매우 초보자입니다. – Hoomanium

답변

0

, 자연 소멸자는 다음과 같습니다

Hash::~Hash() 
{ 
    for (int i=0; i<size; ++i) 
    { 
     while (HashTable[i]) 
     { 
      item *victim = HashTable[i]; 
      HashTable[i] = victim->next; 
      delete victim; 
     } 
    } 
} 

참고 : 귀하의 클래스 하지입니다 Rule of Three을 준수합니다. 링크 된 기사를 읽는 것이 중요하므로 더 빨리 배우십시오.

+0

다음은 ptr-> 다음입니까? – Hoomanium

+0

Thanks WhozCraig. 당신은 "... 아이템은 자체적 인 파라미터 화 된 생성자를 필요로합니다. 처음에는 저장할 데이터가있을 때만 필요하다는 것을 알 수 있습니다." 항목에 데이터를 저장합니다. 전화 번호부와 같습니다. 따라서 사용자가 데이터를 삽입하고 키 값 쌍이 해시 테이블에 저장됩니다. 항목 구조에서 매개 변수를 초기화해야합니까? – Hoomanium

+0

매개 변수화 된 생성자를 사용한다는 것은 단순히 "테이블"이 처음에'nullptr '로 채워져 있다는 철학을 채택하면,'item'을 생성 할 필요가있는 유일한 시간은 실제로 삽입 할 때입니다 * 충돌 목록 테이블에 실제 데이터가 저장됩니다. 매개 변수 목록으로'(const std :: string & s, int n, item * next = nullptr)'을 취하는 생성자를 가지며 [* 초기화 목록 *] (http : // www.parashift.com/c++-faq/init-lists.html). 너의'item's을 충분히 오래 사용하면 더 명확한 이유가 될 것입니다. – WhozCraig

0

소멸자에 대한 접근 방식.

Hash::~Hash(){ 
    for (int i = 0; i < size; i++) { 
     // first: you must delete HashTable[i]->next <-- your homework. 
     // second: delete HashTable[i] 
     if (HashTable[i]) 
      delete HashTable[i]; 
    } 
} 

일반적으로 연산자 new와 연산자 delete는 항상 동일한 양이어야합니다. 연산자 new []가있는 경우 연산자 delete []를 사용해야합니다. 예를 들어

, 할당 :

char * foo = new char[size]; 

해제 : 소스 감안할 때

delete [] foo; 
관련 문제