为什么windows下没有double free 异常

wuyg719 2013-01-08 11:24:34
我有一个简单的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;
}
...全文
523 25 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
dingqiang107 2013-02-01
  • 打赏
  • 举报
回复
double free异常是由管理内存分配的库抛出的,这个库是由平台决定的,自然不同平台下的行为可能会不一样。 C++标准里只说这是一个未定义。
wuyg719 2013-01-31
  • 打赏
  • 举报
回复
我的环境是 OS: windows 7 IDE: Qt Creator 2.4.1
youyou1912 2013-01-30
  • 打赏
  • 举报
回复
double free正常会破坏堆, 堆破坏后是否立刻抱错还要看情况, 可能立刻也可能是再次分配请求或者退出的时候CRT堆自我释放的时候应该会发生异常了.
youyou1912 2013-01-30
  • 打赏
  • 举报
回复
楼主什么环境试的? 我debug直接在堆释放时候检查asset失败抱错. Release版本会double free, 异常退出啊. 环境: win7 + Vs2012,
wuyg719 2013-01-28
  • 打赏
  • 举报
回复
就没有人知道吗?
wuyg719 2013-01-13
  • 打赏
  • 举报
回复
我能明白为什么会出现double free 异常,但我不明白该出现double free 异常但没有出现。
cyclejdm 2013-01-11
  • 打赏
  • 举报
回复
引用 9 楼 smallnat 的回复:
引用 2 楼 Kaile 的回复:delete m_data ; 改为: if(m_data) { delete m_data ; m_data = NULL; } 就永远不会有异常 多次释放同一块空间,肯定会有异常。 要避免这样的问题:在有指针成员变量的类中,重新写满足你需求的拷贝构造函数和赋值函数。
我能说”顶“吗
ljhhh0123 2013-01-10
  • 打赏
  • 举报
回复
两次delete同一内容,查一下C++标准文档,如果没有规定,就别指望两个平台会有一致的结果.
wulinnm 2013-01-10
  • 打赏
  • 举报
回复
哎!你们啊! BitWiseCopyClass *objA =new BitWiseCopyClass; BitWiseCopyClass *objB =new BitWiseCopyClass; objB = objA; delete objA; delete objB; printf("done\n"); return 0; delete两次指向同一个地址。会造成那个叫什么堆什么的错误,好像这个错误是非常隐蔽而且很致命的!
iamnobody 2013-01-09
  • 打赏
  • 举报
回复
抛出 double free 异常 是一个确定的行为 你写了行为未定义的代码却去期待一个确定的行为.这是错的.
jimette 2013-01-09
  • 打赏
  • 举报
回复
BitWiseCopyClass objA; BitWiseCopyClass objB; objB = objA; 在windows下面这个指向的不是同一地址!
hznat 2013-01-09
  • 打赏
  • 举报
回复
引用 2 楼 Kaile 的回复:
delete m_data ; 改为: if(m_data) { delete m_data ; m_data = NULL; } 就永远不会有异常
多次释放同一块空间,肯定会有异常。 要避免这样的问题:在有指针成员变量的类中,重新写满足你需求的拷贝构造函数和赋值函数。
ri_aje 2013-01-09
  • 打赏
  • 举报
回复
这种东西叫 undefined behavior,标准没说到底应该是什么行为,因此完全看实现,一边完蛋一边貌似无误的行为正常。
lee_鹿游原 2013-01-09
  • 打赏
  • 举报
回复

 //申请空间于堆上,释放空间会异常,而栈上没有异常
//同求原因吧... 
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;
}

iceheart 2013-01-09
  • 打赏
  • 举报
回复
代码写错了,程序没崩溃,这是最可怕的事了
wulinnm 2013-01-09
  • 打赏
  • 举报
回复
晕,安我的理解没问题啊!你赋值是你赋值,但昔构执行不受影响
lee_鹿游原 2013-01-09
  • 打赏
  • 举报
回复
没有深拷贝,释放空间,没有崩堆栈。我也想知道..
小布 2013-01-09
  • 打赏
  • 举报
回复
引用 6 楼 lile1234_show 的回复:
C/C++ code?1234567891011121314151617181920212223 //申请空间于堆上,释放空间会异常,而栈上没有异常//同求原因吧... class BitWiseCopyClass {public: BitWiseCopyClass(){m_data= new int;}; ~BitWiseCopyClass() { ……
你直接就按这个直接delete两次试试不必你那来的痛快
mujiok2003 2013-01-09
  • 打赏
  • 举报
回复
取决于编译器实现而不是操作系统。这属于UB(未定义的行为).
疯狂的红豆 2013-01-09
  • 打赏
  • 举报
回复
造成内存泄露并且还导致了两个对象的指针指向同一块内存区域,我觉得delete在指向之前可能做了某些判断致使未抛出错误,这仅仅是我个人观点。 永远不要依赖于未定义行为
加载更多回复(5)

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧