【发布时间】:2012-01-01 13:05:20
【问题描述】:
我有一个名为“Packet”的类,带有这个破坏:
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是否为空。如果它已经被释放,或者指向一个随机的(例如未初始化的)内存位置,则该测试将通过。 -
如果
req被释放,那么我认为它是空的,所以if (req)应该会失败。不是吗?删除对象和null有什么区别? -
不,释放 req 不会使其变为空。如果你想要那种行为,你必须自己做。
free req对req指针本身没有影响,只会影响它指向的内容(如果它指向正确类型的有效、活动对象)。 -
不,您必须在
delete之后将req设置为NULL。delete会为你做这件事。
标签: c++ destructor glibc