0

我正在尝试创建自己的 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;
}
4

2 回答 2

1

你需要遵循三法则

提供复制构造函数和复制赋值运算符,它们对动态分配的成员进行深度复制。

除了,

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

只是尊重一个未初始化的指针。*list没有指向任何有意义的东西,因为list从未初始化过。

于 2012-12-15T04:23:27.770 回答
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];

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

要销毁它,只需以相反的顺序执行,但请记住使用delete[],因为您已将其分配给new[].

for (int i=0; i < X; i++)
    delete[] list[i];
delete[] list;
于 2012-12-15T05:00:01.577 回答