这个错误是多次的调用了delete
来释放已经释放过的空间
#include <iostream>
using namespace std;
int main(void) {
int* val = new int[5];
delete[] val;
delete[] val;
return 0;
}
这个错误比较常见的就是在类的 成员函数 调用时,忘记使用引用类型引起
class A {
public:
A(): val(nullptr) {}
A(int* val): val(val) {}
~A() {
delete[] this->val;
}
friend int func(const A obj) {
return obj.val[0];
}
private:
int* val;
};
int main(void) {
int* val = new int[5];
val[0] = 1;
A obj(val);
cout << obj.func(obj) << endl;
return 0;
}
上述程序会成功打印obj.val[0]
的值,但是会提示free(): double free detected in tcache 2
的错误信息
这是由于func
函数错误的使用了const Demo obj
这里的代码会让编译器当成去定义一个 const Demo
类型的变量叫做obj
由于调用这个函数会把实参复制一份赋给形参
所以这里的语句就会被误认为为const Demo obj = obj
会被编译器当成执行构造拷贝函数,所以这里的临时 obj 和 main 函数的 obj 对象中的 私有成员 变量 val指向的是同一片空间的地址
临时对象obj在函数体执行完成后便会自动调用析构函数,所以obj.val的 空间已经被释放,再去释放main函数中的 obj.val 的空间时便会出现多次释放的错误