2012-12-15 30 views
0

我試圖創建自己的HashMap來了解它們的工作原理。我正在使用一個鏈接列表數組來將值(字符串)存儲在我的哈希映射中。因動態數組而導致的HashMap內存泄漏

我創建數組是這樣的:

Node** list; 

取而代之的是:

Node* list[nSize]; 

這是這樣的陣列可以在運行時的任何尺寸。但我認爲我正在發生內存泄漏,因爲我正在這樣做。我不知道錯誤在哪裏,但是當我運行以下簡單代碼時.exe崩潰。

爲什麼我的應用程序崩潰了,我該如何修復它?

注意:我知道使用向量會比數組好,但這只是爲了學習,我想挑戰自己使用'動態'數組來創建哈希映射。 PS:是我正在使用的那種數組的正確術語(動態數組)?

struct Node 
{ 
    // to implement 
}; 

class HashMap 
{ 
    public: 
    HashMap(int dynSize) 
    { 
     *list = new Node[dynSize]; 
     size = dynSize; 

     for (int i=0; i<size; i++) 
      list[i] = NULL; 

     cout << "END\n"; 
    } 

    ~HashMap() 
    { 
     for (int i=0; i<size; i++) 
      delete list[i]; 
    } 

    private: 
    Node** list; // I could use a vector here but I am experimenting with a pointer to an array(pointer), also its more elegant 
    int size; 
}; 

int main() 
{ 
    // When I run this application it crashes. Where is my memory leak? 
    HashMap h(5); 

    system("PAUSE"); 
    return 0; 
} 

回答

1

您需要按照Rule of Three

提供複製構造函數和複製賦值運算符,它們爲動態分配的成員創建深層副本。

此外,

Node** list; 
*list = new Node[dynSize]; 

只是deferences未初始化的指針。由於list從未初始化,因此*list沒有指向任何有意義的內容。

0

正如Alok Save提到的,您正在取消引用未初始化的指針。這裏的關鍵是你有一個需要兩步初始化的雙指針。首先,你必須分配內存list

// note that I'm using 'X', simply using 'size' doesn't work for two dimensions 
list = new Node*[X]; 

現在,你有X節點的指針,你需要將每一個點爲Y的節點。

for (int i = 0; i < X; i++) 
    list[i] = new Node[Y]; 

如果新不能分配內存,你可能會想要做一些錯誤處理,但這至少會得到Node **的內置。

要破壞這一點,只需以相反的順序進行操作,但請記住使用delete[],因爲您已將它分配給new[]

for (int i=0; i < X; i++) 
    delete[] list[i]; 
delete[] list;