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