[英]C++ Free Heap block 3da9e0 modified at 3daa08 after it was freed
[英]c++ Heap warning: Free heap block modified after it was freed
我有以下类和代码:
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()时,一切都很好。 当我第二次调用它时,我的程序崩溃说“警告:HEAP:在释放之后在006618D4处修改了自由堆块006618C0”,在分配temp之后。 是什么导致这个?
如果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实例,内部变量指向同一个动态分配的内存。 当一个实例被销毁时,另一个实例的内部变量将指向已经释放的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.