由于动态数组而导致的哈希映射内存泄漏

HashMap Memory Leak because of Dynamic Array

本文关键字:哈希 映射 泄漏 内存 于动态 动态 数组      更新时间:2023-10-16

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

你需要遵循三法则

提供复制构造函数和复制赋值运算符,用于创建动态分配成员的深层副本。

此外

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

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

正如 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;