【发布时间】:2021-11-30 21:32:07
【问题描述】:
我有以下类和代码:
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() 时,一切都很好。当我第二次调用它时,我的程序在分配 temp 后立即崩溃说“警告:堆:释放堆块 006618C0 在 006618D4 被释放后修改”。这是什么原因造成的?
【问题讨论】:
-
你不能在没有初始化的情况下使用
elements。 -
您删除 elements ,然后将 temp 分配给它。
-
@LuchianGrigore 元素在此处未显示的构造函数中初始化。
-
@StephaneRolland typename 很好。
-
@SChepurin 那我该怎么办,为什么会出现问题?
标签: c++ heap-memory