c++ 堆警告:释放后修改了空闲堆块
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()时,一切都很好。当我第二次调用它时,我的程序崩溃说"警告:堆:释放后在 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 实例,其内部变量指向相同的动态分配内存。当一个实例被销毁时,另一个实例的内部变量将指向已经释放的内存。
相关文章:
- 警告处理为错误这里有什么问题
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- C++ 当容器在使用前被破坏/修改时发出警告(通过引用元素或迭代器使用)
- 视觉C++ 禁用不可修改源的警告
- c++ 堆警告:释放后修改了空闲堆块
- 重新配置C++代码以处理“警告:未按顺序修改和访问参数”
- 在C++11中,未排序的修改警告变为结果未使用的警告
- assert()修改变量时发出警告