C++ 哈希表-析构函数问题(未分配被释放的指针)

C++ 哈希表-析构函数问题(未分配被释放的指针),c++,constructor,linked-list,hashtable,rule-of-three,C++,Constructor,Linked List,Hashtable,Rule Of Three,我有一个哈希表,其中通过链接(链表)处理冲突。每个链表的第一个节点的每个数组位置都有一个指针。下面显示的是一个常规构造函数以及3个函数的规则 虽然我的代码正在编译,我的函数(add、remove等)正在生成正确的输出,但我的析构函数(IDE用线程1:SIGABRT指向它)有问题,并且在我的驱动程序完成运行后,控制台显示“指针被释放未分配”。我想不出哪里出了问题,所以我们非常感谢您的帮助。除了构造函数/析构函数外,我没有包含任何其他函数(添加、删除等)的代码 即使在注释掉copy和重载=构造函数时

我有一个哈希表,其中通过链接(链表)处理冲突。每个链表的第一个节点的每个数组位置都有一个指针。下面显示的是一个常规构造函数以及3个函数的规则

虽然我的代码正在编译,我的函数(add、remove等)正在生成正确的输出,但我的析构函数(IDE用线程1:SIGABRT指向它)有问题,并且在我的驱动程序完成运行后,控制台显示“指针被释放未分配”。我想不出哪里出了问题,所以我们非常感谢您的帮助。除了构造函数/析构函数外,我没有包含任何其他函数(添加、删除等)的代码

即使在注释掉copy和重载=构造函数时,析构函数仍然会出现同样的问题

规格:

class HashTable {

public:

    HashTable(int);
    ~HashTable();
    HashTable(const HashTable &);
    HashTable& operator=(const HashTable &);

private:

    struct Node {
        string word;
        int wordCount;
        Node * next;

        // node constructor
        Node(string w, int count) {
            word = w;
            wordCount = count;
            next = nullptr;
        }
    };

    Node** wordList;
    int capacity;

    int hashFunction(string);
};
实施大4:

建造商:

HashTable::HashTable(int cap) {
    capacity = cap;
    wordList = new Node*[capacity];
    for (int i = 0; i < capacity; i++)
        wordList[i] = nullptr;   
}
HashTable::HashTable(const HashTable &obj) {
    capacity = obj.capacity;
    wordList = new Node*[capacity];
    for (int i = 0; i < capacity; i++) {
        if (obj.wordList[i] == nullptr)
            continue;
        Node * newNode = new Node(obj.wordList[i]->word,        
                                  obj.wordList[i]->wordCount);
        wordList[i] = newNode;
    }
}
HashTable::HashTable(int-cap){
容量=上限;
wordList=新节点*[容量];
对于(int i=0;i
析构函数(问题似乎在哪里)

HashTable::~HashTable(){
对于(int i=0;i下一步;
删除上一页;
}
}
删除[]字表;
}
复制构造函数:

HashTable::HashTable(int cap) {
    capacity = cap;
    wordList = new Node*[capacity];
    for (int i = 0; i < capacity; i++)
        wordList[i] = nullptr;   
}
HashTable::HashTable(const HashTable &obj) {
    capacity = obj.capacity;
    wordList = new Node*[capacity];
    for (int i = 0; i < capacity; i++) {
        if (obj.wordList[i] == nullptr)
            continue;
        Node * newNode = new Node(obj.wordList[i]->word,        
                                  obj.wordList[i]->wordCount);
        wordList[i] = newNode;
    }
}
HashTable::HashTable(常量HashTable&obj){
容量=对象容量;
wordList=新节点*[容量];
对于(int i=0;iword,
obj.wordList[i]->wordCount);
wordList[i]=newNode;
}
}
复制分配操作员:

HashTable& HashTable::operator=(const HashTable &obj) {
    if (this != &obj) {
        for (int i = 0; i < capacity; i++) {
            Node* curr = wordList[i];
            while (curr != nullptr) {
                Node* prev = curr;
                curr = curr->next;
                delete prev;
            }
        }
        delete[] this->wordList;

        this->capacity = obj.capacity;
        this->wordList = new Node*[capacity];
        for (int i = 0; i < this->capacity; i++) {
            if (obj.wordList[i] == nullptr)
                continue;                
            Node * newNode = new Node(obj.wordList[i]->word,
                                      obj.wordList[i]->wordCount);
            this->wordList[i] = newNode;
        }
    }
    return *this;
}
HashTable和HashTable::operator=(常量HashTable和obj){
如果(此!=&obj){
对于(int i=0;i下一步;
删除上一页;
}
}
删除[]这个->单词列表;
此->容量=对象容量;
此->单词列表=新节点*[容量];
对于(int i=0;icapacity;i++){
if(对象字列表[i]==nullptr)
继续;
Node*newNode=新节点(obj.wordList[i]->word,
obj.wordList[i]->wordCount);
此->单词列表[i]=newNode;
}
}
归还*这个;
}

在复制构造函数和复制赋值运算符中,您正在将列表指针从
obj
复制到
this
。这会在两个对象中留下相同的指针,一旦释放了一个哈希表,就会产生双重释放和其他问题


进行复制时,需要进行深度复制,即为单词列表的副本分配新节点。

在复制构造函数和复制赋值运算符中,您正在将列表指针从
obj
复制到
this
中。这会在两个对象中留下相同的指针,一旦释放了一个哈希表,就会产生双重释放和其他问题


进行复制时,需要进行深度复制,即为单词列表的副本分配新节点。

谢谢!我只是这样做了,但现在我的代码无法编译,因为在复制构造函数下的指示行中出现了“Thread 1:EXC_BAD_ACCESS(code=1,address=0x0)”错误。我通过在复制构造函数和重载赋值构造函数中的每个for循环下添加一个if语句修复了该错误。但现在我又回到了原来的错误。谢谢!我只是这样做了,但现在我的代码无法编译,因为在复制构造函数下的指示行中出现了“Thread 1:EXC_BAD_ACCESS(code=1,address=0x0)”错误。我通过在复制构造函数和重载赋值构造函数中的每个for循环下添加一个if语句修复了该错误。但现在我又回到了原来的错误。