gpt4 book ai didi

C++ 堆警告 : Free heap block modified after it was freed

转载 作者:行者123 更新时间:2023-11-28 03:00:41 24 4
gpt4 key购买 nike

我有以下类和代码:

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() 时,一切正常。当我第二次调用它时,我的程序崩溃说“警告:堆:释放堆 block 006618C0 在释放后在 006618D4 处修改”,就在临时分配之后。什么会导致这种情况?

最佳答案

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

删除传递给函数的“originalSize”参数。

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

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

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 类实例,其内部变量指向相同的动态分配内存。并且当一个实例被销毁时,另一个实例的内部变量将指向一个已经释放的内存。

关于C++ 堆警告 : Free heap block modified after it was freed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20934166/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com