我编写了这个 HashMap (这是电话面试练习的一部分),当我放置一个元素时,我会在其中执行一个new Node(key, value)
。我想确保当 HashMap 本身超出范围时我正在清理。
我错过了什么吗?有什么方法可以检查是否存在内存泄漏?
class HashMap {
private:
list<Node*> data[SIZE];
public:
~HashMap();
Node* get(int key);
void put(int key, int value);
int hashFn(int val){ return val % 13; }
};
HashMap::~HashMap(){
for(int i = 0; i < SIZE; ++i){
list<Node*>& val = data[i];
for(list<Node*>::iterator it = val.begin(); it != val.end(); it++){
Node* n = *it;
delete n;
}
}
}
对于好奇心:完整的代码在这里:http://rextester.com/EHPCYW12862
编辑:
另外,我真的最终需要调用list.clear()吗(因为我已经释放了列表中的所有节点)?
最佳答案
看来put
正在构建一个Node
放入哈希表中,关联 key
和value
。没有必要使用list<Node *>
,使用 list<Node>
会更干净相反。
list<Node> data[SIZE];
//...
data[bucket].push_front(Node(key, value));
那么,您本可以避免实现析构函数。
您的get
函数仍然可以返回指针。
Node* HashMap::get(int key){
//...
list<Node>::iterator it = data[bucket].begin();
//...
if (it->key == key) return &*it;
//...
return NULL;
}
如果您将实现保留为 list<Node *>
,那么您还应该实现一个复制构造函数和一个赋值运算符( the rule of three )。
关于c++ - 从C++中的链表中删除指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11896885/