我有一个名为“数据包”这个自毁类:双重释放或腐败删除对象
class Packet
{
...
RequestPtr req;
~Packet()
{
if (req && isRequest() && !needsResponse())
delete req;
deleteData();
}
};
的RequestPtr样子:
typedef Request* RequestPtr;
class Request
{
...
~Request() {}
}
问题是,当delete req;
,因此~Request() {}
是执行,我得到这个错误:
*** glibc detected *** double free or corruption (fasttop): 0x0000000002a8a640 ***
起初我认为req
可能在别的地方被删除,当它想要执行delete req;
时,显然没有req
。但是,正如您所看到的,有一个if
语句,用于检查req
是否已定义。所以,当它想要删除req
时,该对象被定义。
这个错误究竟是什么意思?
所有'if(req)'测试是否'req'为null。如果它已经被释放,或者指向一个随机(例如单元化的)内存位置,则该测试将通过。 – Mat 2012-01-01 13:09:04
如果'req'被释放,那么我认为它是空的,所以'if(req)'应该失败。不是吗?删除的对象和null有什么不同? – mahmood 2012-01-01 13:11:19
不,释放req不会使它变为空。如果你想要这种行为,你必须自己去做。 'free req'对'req'指针本身没有任何影响,只有它指向的内容(_if_指向一个有效的,正确类型的活动对象)。 – Mat 2012-01-01 13:14:16