我有一个简单的c++代码演示double free 异常,在linux下面会按照我所期待的那样抛出异常,但在Windows下(QTCreator)没有任何异常:
#include <stdio.h>
class BitWiseCopyClass {
public:
BitWiseCopyClass(){m_data= new int;};
~BitWiseCopyClass(){
delete m_data ;
}
private:
int* m_data;
};
void test(){
BitWiseCopyClass objA;
BitWiseCopyClass objB;
objB = objA;
// 结果导致 objA 和 objB 的指针都指向了同一个地址
// 函数结束析构时
// 同一个地址被delete两次, 所以会抛出double free异常,但在windows下没有抛出任何异常
}
int main()
{
test();
printf("done\n");
return 0;
}
double?free
------解决方案--------------------------------------------------------
是 用debug版本么?要不看下反汇编?
------解决方案--------------------------------------------------------
delete m_data ;
改为:
if(m_data)
{
delete m_data ;
m_data = NULL;
}
就永远不会有异常
------解决方案--------------------------------------------------------
没有深拷贝,释放空间,没有崩堆栈。我也想知道..
------解决方案--------------------------------------------------------
晕,安我的理解没问题啊!你赋值是你赋值,但昔构执行不受影响
------解决方案--------------------------------------------------------
代码写错了,程序没崩溃,这是最可怕的事了
------解决方案--------------------------------------------------------
//申请空间于堆上,释放空间会异常,而栈上没有异常
//同求原因吧...
class BitWiseCopyClass
{
public:
BitWiseCopyClass(){m_data= new int;};
~BitWiseCopyClass()
{
delete m_data ;
}
private:
int* m_data;
};
int main()
{
BitWiseCopyClass *objA =new BitWiseCopyClass;
BitWiseCopyClass *objB =new BitWiseCopyClass;
objB = objA;
delete objA;
delete objB;
printf("done\n");
return 0;
}
------解决方案--------------------------------------------------------
你直接就按这个直接delete两次试试不必你那来的痛快
------解决方案--------------------------------------------------------
这种东西叫 undefined behavior,标准没说到底应该是什么行为,因此完全看实现,一边完蛋一边貌似无误的行为正常。
------解决方案--------------------------------------------------------
多次释放同一块空间,肯定会有异常。
要避免这样的问题:在有指针成员变量的类中,重新写满足你需求的拷贝构造函数和赋值函数。
------解决方案--------------------------------------------------------
BitWiseCopyClass objA;