当前位置: 代码迷 >> C++ >> 为什么windows上没有double free 错误
  详细解决方案

为什么windows上没有double free 错误

热度:1448   发布时间:2013-02-26 00:00:00.0
为什么windows下没有double free 异常
我有一个简单的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;
}


------解决方案--------------------------------------------------------
引用:
C/C++ code?1234567891011121314151617181920212223 //申请空间于堆上,释放空间会异常,而栈上没有异常//同求原因吧... class BitWiseCopyClass {public:    BitWiseCopyClass(){m_data= new int;};    ~BitWiseCopyClass()    {  ……

你直接就按这个直接delete两次试试不必你那来的痛快
------解决方案--------------------------------------------------------
这种东西叫 undefined behavior,标准没说到底应该是什么行为,因此完全看实现,一边完蛋一边貌似无误的行为正常。
------解决方案--------------------------------------------------------
引用:
delete m_data ;

改为:

if(m_data)
{
delete m_data ;
m_data = NULL;
}

就永远不会有异常

多次释放同一块空间,肯定会有异常。

要避免这样的问题:在有指针成员变量的类中,重新写满足你需求的拷贝构造函数和赋值函数。
------解决方案--------------------------------------------------------
   BitWiseCopyClass objA;
  相关解决方案