c++ - 如何删除带有指向其他对象的指针的动态对象数组 (C++)

标签 c++ dynamic hash garbage

长话短说,我必须使用 C++ 中的线性哈希为大学编写一个哈希表。哈希表有效,但资源没有被释放,这是一个问题,尤其是单元测试测试具有 100k+ 值的表并且留下的垃圾是巨大的。 基本上,当我创建新的哈希表时,我会执行以下操作:

hashTable = new Bucket[this->tableSize];
        for (size_t i = 0; i < tableSize; i++) {
            hashTable[i] = * new Bucket();
        }

每个 Bucket 都可以包含一个指向另一个溢出桶的指针,可以设置也可以不设置。

    class Bucket {
    private:
        size_t bucketSize;                                                                   
        size_t elementsInBucket;                                                              
        E v[N];   // int v[N];                                                              
        bool hasOverflow;                                                                     
        Bucket * nextBucket = nullptr; 

我的问题是,我怎样才能删除整个哈希表,包括带有潜在溢出桶的桶,因为下面只释放了一半占用的内存。

delete[] hashTable;
hashTable = nullptr;

谢谢!

最佳答案

您立即在这一行泄漏了一个 Bucket:

hashTable[i] = * new Bucket();

它的作用是:

  1. 分配一个新的Bucket并返回指向它的指针
  2. 取消引用返回的指针并将对新 Bucket 的引用传递给 Bucket::operator=
  3. 将空的 Bucket 复制到已经存在的对象 hashTable[i]
  4. 丢弃指向新分配的 Bucket 的指针,从而泄漏它

hashTable 是指向 tableSize Bucket 数组的第一个元素的指针。这些对象已经存在,因此您无需在循环中分配新对象。

此外,您没有显示 Bucket 的析构函数,也没有显示您如何分配 Bucket::nextBucket。我假设每个 Bucket 都应该拥有它的 nextBucket,所以你应该有一个析构函数来做类似的事情

Bucket::~Bucket()
{
    delete nextBucket;
}

关于c++ - 如何删除带有指向其他对象的指针的动态对象数组 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37368871/

相关文章:

c++ - 我可以在公共(public) header 中安全地将 bool 成员替换为 unsigned char 吗?

c++ - 可以指定 C++20 模板化 lambda 来推断嵌套在参数中的类型吗?

javascript - 为所有子项添加事件监听器

c++ - 从源代码构建 GCC 5.4;如此构建的可执行文件尝试链接不兼容的 libstdc++ 并且无法运行

c++ - 从Web服务器获取数据并发送给客户端C++

c# - 对象没有值(value)

c++ - 动态数组推送功能 - 它是如何工作的?

c++ - 关于multi-probe Local Sensitive Hashing的问题

perl - 如何在perl中创建多个对象并访问相同的方法?

php - MySQL 中的哈希