c++ 堆警告:释放后修改了空闲堆块

c++ Heap warning: Free heap block modified after it was freed

本文关键字:修改 警告 释放 c++      更新时间:2023-10-16

我有以下类和代码:

template <class T>
class HashTable {
struct Pair{
    T element;
    int key;
    Pair(T element, int Key) : element(element), key(key) {};
};
int table_size;
int counter;
List<Pair> (*elements);
void changeTableSize(int newSize){
    List<Pair> *temp = new List<Pair>[newSize];
    for (int i = 0; i < table_size; i++){
        for (typename List<Pair>::Iterator j = elements[i].begin(); j != elements[i].end(); j++){
            Pair  p = *j;
            temp[p.key % newSize].insert(Pair(p.element, p.key));
        }
    }
    delete[] elements;
    elements = temp;
    table_size = newSize;
}
public:
    HashTable() : table_size(100), counter(0){
        elements = new List<Pair>[table_size];
    };
void insert(T data, int key){
    if (member(key)){
        throw ElementAlreadyExists();
    }
    elements[key % table_size].insert(Pair (data, key));
    counter++;
    if (counter == table_size){
        changeTableSize(table_size*2);
    }
};

当我第一次调用changeTableSize()时,一切都很好。当我第二次调用它时,我的程序崩溃说"警告:堆:释放后在 006618D4 修改了可用堆块 006618C0",在分配临时时。什么会导致这种情况?

如果 originalSize> table_size,那么您正在内部"for"循环中执行非法内存访问。

删除要传递给函数的"原始大小"参数。

请改用类变量"table_size",并在返回之前将其更新为新大小。

此外,请确保类对具有正确定义和实现的复制构造函数:

Pair(const Pair& pair)
{
    // For each variable x of pair, that points to dynamically-allocated memory:
    // this->x = new ...
    // memcpy(this->x,pair.x,...)
    // For each variable y of pair, that doesn't point to dynamically-allocated memory:
    // this->y = pair.y
}

否则,您可能有两个不同的类 Pair 实例,其内部变量指向相同的动态分配内存。当一个实例被销毁时,另一个实例的内部变量将指向已经释放的内存。