由于动态数组导致HashMap内存泄漏

时间:2012-12-15 04:19:12

标签: c++ memory-leaks

我正在尝试创建自己的HashMap以了解它们的工作原理。我使用链接列表数组来存储我的hashmap中的值(字符串)。

我正在创建这样的数组:

Node** list;

而不是:

Node* list[nSize];

这样,数组在运行时可以是任何大小。但是我觉得我因为我这样做而得到了内存泄漏。我不知道错误在哪里,但是当我运行以下简单代码时,.exe崩溃了。

为什么我的应用程序崩溃了,如何解决?

注意:我知道使用矢量会比数组好得多,但这只是为了学习而我想挑战自己使用'动态'数组创建hashmap。 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;
}

2 个答案:

答案 0 :(得分:1)

您需要关注 Rule of Three

提供复制构造函数和复制赋值运算符,它们可以生成动态分配的成员的深层副本。

此外,

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

只是推断一个未初始化的指针。 <{1}}并未指出任何有意义的内容,因为*list从未初始化。

答案 1 :(得分:0)

正如Alok Save所提到的,你正在取消引用一个未初始化的指针。这里的关键是你有一个双指针,需要两步初始化。首先,您必须将内存分配给list

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

现在你有了X Node指针,你需要让每一个指向Y节点。

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

如果new无法分配内存,你可能想要做一些错误处理,但这至少会构建Node **。

要销毁此功能,只需按相反顺序执行,但请记住使用delete[],因为您使用new[]进行了分配。

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