读书人

为什么windows上没有double free 错误

发布时间: 2013-02-15 15:46:56 作者: rapoo

为什么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;


BitWiseCopyClass objB;
objB = objA;
在windows下面这个指向的不是同一地址!
[解决办法]
抛出 double free 异常 是一个确定的行为
你写了行为未定义的代码却去期待一个确定的行为.这是错的.
[解决办法]
用Visual Studio构建,执行得到的exe的时候直接被杀毒软件干掉。。。。。
[解决办法]


[解决办法]
造成内存泄露并且还导致了两个对象的指针指向同一块内存区域,我觉得delete在指向之前可能做了某些判断致使未抛出错误,这仅仅是我个人观点。
永远不要依赖于未定义行为
[解决办法]
取决于编译器实现而不是操作系统。这属于UB(未定义的行为).
[解决办法]
两次delete同一内容,查一下C++标准文档,如果没有规定,就别指望两个平台会有一致的结果.
[解决办法]
double free异常是由管理内存分配的库抛出的,这个库是由平台决定的,自然不同平台下的行为可能会不一样。

C++标准里只说这是一个未定义。

读书人网 >C++

热点推荐