由于动态数组而导致的哈希映射内存泄漏
HashMap Memory Leak because of Dynamic Array
我正在尝试创建自己的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;
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 使用 Key 对 C++ 中的哈希映射进行排序. 无法排序
- 哈希映射使用 nullptr c++ 初始化节点的动态数组
- 如何按值对无序哈希映射进行排序
- 哈希映射如何在 c++ 中实现?
- C++中的哈希映射等效
- 以字符串向量作为值的哈希映射
- 来自并发哈希映射的迭代器是否安全
- 如何在这个哈希映射中实现 AVL 树
- 无法迭代结构"string"的哈希映射:[列表] C++
- 什么是最快的解决方案,用于读/写入哈希映射
- 可以安全地依赖unordered_map中的初始化值(哈希映射)
- 使用按插入方式排序的参数创建哈希映射
- 哈希映射没有可行的重载 '='
- 使用分配器对哈希映射进行高效的序列化和反序列化
- 由于动态数组而导致的哈希映射内存泄漏
- 为boost哈希映射定义自定义哈希函数
- 是我们迭代时更改哈希映射的行为,已定义
- 哈希映射和有序遍历
- 哈希映射错误:与调用 '(const __gnu_cxx::.