Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何删除指向其他对象(C+;+;)的指针的动态对象数组 长话短说,我必须用C++中的线性散列来为大学代码编写一个哈希表。哈希表可以工作,但资源没有被释放,这是一个问题,特别是单元测试使用100k+值测试表,留下的垃圾非常大。 基本上,在创建新哈希表时,我会执行以下操作: hashTable = new Bucket[this->tableSize]; for (size_t i = 0; i < tableSize; i++) { hashTable[i] = * new Bucket(); }_C++_Dynamic_Hash_Garbage - Fatal编程技术网

如何删除指向其他对象(C+;+;)的指针的动态对象数组 长话短说,我必须用C++中的线性散列来为大学代码编写一个哈希表。哈希表可以工作,但资源没有被释放,这是一个问题,特别是单元测试使用100k+值测试表,留下的垃圾非常大。 基本上,在创建新哈希表时,我会执行以下操作: hashTable = new Bucket[this->tableSize]; for (size_t i = 0; i < tableSize; i++) { hashTable[i] = * new Bucket(); }

如何删除指向其他对象(C+;+;)的指针的动态对象数组 长话短说,我必须用C++中的线性散列来为大学代码编写一个哈希表。哈希表可以工作,但资源没有被释放,这是一个问题,特别是单元测试使用100k+值测试表,留下的垃圾非常大。 基本上,在创建新哈希表时,我会执行以下操作: hashTable = new Bucket[this->tableSize]; for (size_t i = 0; i < tableSize; i++) { hashTable[i] = * new Bucket(); },c++,dynamic,hash,garbage,C++,Dynamic,Hash,Garbage,我的问题是,如何删除整个hashtable,包括可能溢出的bucket,因为下面只释放了占用内存的一半 delete[] hashTable; hashTable = nullptr; 谢谢 您立即在此行中泄漏了一个桶: hashTable[i] = * new Bucket(); 它的作用是: 分配一个新的Bucket,并返回指向它的指针 取消对返回指针的引用,并将对新Bucket的引用传递给Bucket::operator= 将空的Bucket复制到已经存在的对象哈希表[i] 丢弃指向新

我的问题是,如何删除整个hashtable,包括可能溢出的bucket,因为下面只释放了占用内存的一半

delete[] hashTable;
hashTable = nullptr;

谢谢

您立即在此行中泄漏了一个

hashTable[i] = * new Bucket();
它的作用是:

  • 分配一个新的
    Bucket
    ,并返回指向它的指针
  • 取消对返回指针的引用,并将对新
    Bucket
    的引用传递给
    Bucket::operator=
  • 将空的
    Bucket
    复制到已经存在的对象
    哈希表[i]
  • 丢弃指向新分配的
    存储桶的指针,从而泄漏它
  • hashTable
    是指向
    tableSize
    Bucket
    s数组的第一个元素的指针。这些对象已经存在,因此不需要在循环中分配新对象

    此外,您还没有显示
    Bucket
    的析构函数,也没有显示如何分配
    Bucket::nextBucket
    。我假设每个
    Bucket
    都应该拥有自己的
    nextBucket
    ,所以您应该有一个析构函数

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

    您立即在此行中泄漏了一个

    hashTable[i] = * new Bucket();
    
    它的作用是:

  • 分配一个新的
    Bucket
    ,并返回指向它的指针
  • 取消对返回指针的引用,并将对新
    Bucket
    的引用传递给
    Bucket::operator=
  • 将空的
    Bucket
    复制到已经存在的对象
    哈希表[i]
  • 丢弃指向新分配的
    存储桶的指针,从而泄漏它
  • hashTable
    是指向
    tableSize
    Bucket
    s数组的第一个元素的指针。这些对象已经存在,因此不需要在循环中分配新对象

    此外,您还没有显示
    Bucket
    的析构函数,也没有显示如何分配
    Bucket::nextBucket
    。我假设每个
    Bucket
    都应该拥有自己的
    nextBucket
    ,所以您应该有一个析构函数

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

    除非我弄错了,否则以下代码行是内存泄漏:

    hashTable[i] = * new Bucket();
    
    这里要做的是在堆上分配一个新的Bucket对象,然后立即按值将其复制到数组中。使用new创建的指针超出范围,堆上的原始存储桶泄漏。剩下的是刚刚在堆中分配并泄漏的内容的副本

    相反,您应该在数组中存储指针,如下所示:

    hashTable = new *Bucket[this->tableSize];
    for (size_t i = 0; i < tableSize; i++) {
        hashTable[i] = new Bucket();
    }
    
    最后,您需要更改执行此操作的任何代码:

    hashTable[i].something
    
    为此:

    hashTable[i]->something
    

    在我看来,这是处理动态数组的正确方法。

    除非我弄错了,否则以下代码行是内存泄漏:

    hashTable[i] = * new Bucket();
    
    这里要做的是在堆上分配一个新的Bucket对象,然后立即按值将其复制到数组中。使用new创建的指针超出范围,堆上的原始存储桶泄漏。剩下的是刚刚在堆中分配并泄漏的内容的副本

    相反,您应该在数组中存储指针,如下所示:

    hashTable = new *Bucket[this->tableSize];
    for (size_t i = 0; i < tableSize; i++) {
        hashTable[i] = new Bucket();
    }
    
    最后,您需要更改执行此操作的任何代码:

    hashTable[i].something
    
    为此:

    hashTable[i]->something
    

    在我看来,这似乎是处理动态数组的正确方法。

    A
    Bucket
    本质上只是链表的一个节点。那么,删除链表的常用方法是什么呢?我没有看到
    Bucket
    virtual~Bucket(){delete nextBucket;}
    的析构函数,如果我对析构函数进行编码,程序中断,我在扩展数组时获得了EXC\u BAD\u访问权限。@cookiemonster析构函数告诉您在更上游的地方有问题。因此,您需要将析构函数留在代码中,并修复实际问题(问题不是析构函数)。Bucket本质上只是链表的一个节点。那么,删除链表的常用方法是什么呢?我没有看到
    Bucket
    virtual~Bucket(){delete nextBucket;}
    的析构函数,如果我对析构函数进行编码,程序中断,我在扩展数组时获得了EXC\u BAD\u访问权限。@cookiemonster析构函数告诉您在更上游的地方有问题。因此,您需要在代码中保留析构函数,并修复实际问题(问题不是析构函数)。析构函数与您编写的析构函数非常相似。除此之外,我还将nextBucket分配给nullptr。对于nextBucket的分配,调用add方法(const E&E)将对象添加到bucket中。如果当前bucket已满,则会创建一个新bucket,并将对象添加到该bucket中。问题是,当使用这样的析构函数时,我得到了一个EXC_BAD+access,那么您的
    add
    方法可能有问题。最有可能导致双重空闲或空闲后使用的内容。当检查当前存储桶是否有其他溢出存储桶时,会弹出错误。但是谢谢!明天早上我会查的。析构函数和你写的差不多。除此之外,我还将nextBucket分配给nullptr。对于nextBucket的分配,调用add方法(const E&E)将对象添加到bucket中。如果当前bucket已满,则会创建一个新bucket,并将对象添加到该bucket中。问题是,当使用这样的析构函数时,我得到了一个EXC_BAD+access,那么您的
    add
    方法可能有问题。引起混乱的事情