免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4808 | 回复: 14
打印 上一主题 下一主题

c++ 为什么不报double free的错误 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-08 16:57 |只看该作者 |倒序浏览

编译器为 g++ version is g++ (GCC) 4.1.2 20080704 (Red Hat 4.1.2-50)

我的程序如下:

  1.     #include <iostream>
  2.     using namespace std;

  3.     class Handle{
  4.     public:
  5.             Handle(int *p, int u):_p(p),use(u){}
  6.             ~Handle(){cout << "delete" << endl; delete _p;}
  7.             void display(){cout << "value : " << *_p << ", use : " << use << endl;}
  8.     private:
  9.             int *_p;
  10.             int use;
  11.     };

  12.     int main()
  13.     {
  14.         //Test case one
  15.         {
  16.         int *i = new int(10);

  17.         Handle *h = new Handle(i, 2);
  18.         Handle *h1 = new Handle(i, 100);

  19.         h->display();
  20.         h1->display();

  21.         delete h;
  22.         delete h1;
  23.         //调用了两次析构函数,应该delete了指针i指向的内存两次,但是不报错double free
  24.         }

  25.         //Test case two
  26.         {
  27.             int *a = new int(11);
  28.             Handle h2(a, 23);
  29.             Handle h3(a, 33);

  30.             h2.display();
  31.             h3.display();

  32.             //这里就会报double free
  33.         }
  34.         cout << "ok" << endl;
  35.         return 0;
  36.     }
复制代码
case two 报错我明白,但是为什么case one不报错??

论坛徽章:
0
2 [报告]
发表于 2012-07-08 17:09 |只看该作者
本帖最后由 龙骨五钱 于 2012-07-08 17:10 编辑

delete会自动判断的。

更正:delete会判断是不是空指针,不是你说的这个。。

论坛徽章:
0
3 [报告]
发表于 2012-07-08 17:13 |只看该作者
回复 2# 龙骨五钱


    能不能说清楚点,我没有明白你指的是什么意思?

论坛徽章:
0
4 [报告]
发表于 2012-07-08 17:23 |只看该作者
回复 3# xian412855621


    。。。。我一开始没看仔细,结果说错了。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
5 [报告]
发表于 2012-07-08 17:28 |只看该作者
delete NULL;
会不会报错呢?

论坛徽章:
0
6 [报告]
发表于 2012-07-08 18:43 |只看该作者
delete 一个空指针是安全的

论坛徽章:
0
7 [报告]
发表于 2012-07-08 19:53 |只看该作者
delete一个空指针是安全的,delete一个指针两次是未定义的。
delete并不会把一个指针变成NULL。

论坛徽章:
0
8 [报告]
发表于 2012-07-08 20:30 |只看该作者
回复 7# _Rayx
case one 和 case two 同样都是delete 两次,可是 case two 就不会报错。

我感觉case one 和 case two 就是类似下面这样的代码

  1. int *a = new int(10);
  2. int *b = a;

  3. delete a;
  4. delete b;
复制代码
应该都报double free 错误的


   

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
9 [报告]
发表于 2012-07-08 22:31 |只看该作者
貌似 case 2 是三次吧:

delete h3;
delete h2;
delete a;

论坛徽章:
0
10 [报告]
发表于 2012-07-09 10:51 |只看该作者
回复 9# cdtits

int *a 是动态分配的,所以需要自己手动delete,而case two 中并没有手动delete,所以只是两次


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP