C++:free(): double free detected in tcache 2错误

这个错误是多次的调用了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 的空间时便会出现多次释放的错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值