c++ - 从C++中的链表中删除指针

标签 c++ memory memory-leaks hashmap

我编写了这个 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放入哈希表中,关联 keyvalue 。没有必要使用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/

相关文章:

memory-management - Racket C 结构不会自动回收

java - 固定大小的 LinkedHashMap 内存泄漏?

c++ - 来自字符串的 cv::VideoCapture 在 Mac 上的 Qt5 中给出链接器错误

c++ - 无法将外部 git CMake 项目的输出(静态库)链接到 CMake 项目

c++ - apple mach o 链接器错误创建基本 AI CC 插件

c - 这是不好的做法吗?将指向空白字符串的指针重定向到另一个字符串?

C# 方法的内存处理

python - 通过迭代输入的每个文件来制作 zip 的内存副本

c++ - 生成除循环旋转之外的所有排列

java - 从 Fragment 调用 MainActivity 的方法或使用 Singleton 类,哪个更能防止内存泄漏?