免费注册 查看新帖 |

Chinaunix

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

[C++] 请教高手,内存泄漏检查方面的,标题要长长长长长长长 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-06-22 21:16 |只看该作者 |倒序浏览
1、背景
想写个简单的、Unix平台下C++内存泄漏检查工具,针对new/delete做了一层封装,以对象地址做为
唯一性标识。

2、问题
假设基类CBase,其派生类CDerived。
创建CDerived对象:
    CDerived *p_derived = MY_NEW CDerived();  //内存泄漏检查工具:记录对象地址pDerived

但删除的时候,我们经常通过基类指针删除:
     CBase *p_base = ...;            // 指向p_derived 对象
     MY_DELETE p_base;      // 内存泄漏工具:由于p_base不等于p_derived,很难用于标识同一对象。

3、要求
在调用MY_DELETE时不能用xxx_cast来转换,因为,我想做一个通用的方法,使调用者不必关系基类以及
派生类。

不知道我说得是否清楚?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:50:28
2 [报告]
发表于 2011-06-23 09:34 |只看该作者
  1. #include<stdio.h>

  2. class A
  3. {};

  4. class B:public A
  5. {
  6. };

  7. int main()
  8. {
  9.     B *b = new B();
  10.     A *a = b;
  11.     printf("%x %x\n", long(b), long(a));
  12.     delete a;
  13.     return 0;
  14. }
复制代码
出来地址一样。

论坛徽章:
0
3 [报告]
发表于 2011-06-23 14:04 |只看该作者
valgrind...
查查资料...

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
4 [报告]
发表于 2011-06-24 03:58 |只看该作者
怎么会不等呢?... 没看明白.

你想自己包装new和delete,使用my_new和my_delete来检测内存泄漏?...... 闻所未闻... 假使有人使用my_new分配对象,然后忘记调用my_delete删除,...你的my_delete能检测到这种内存泄漏吗?......

需要检测内存泄露... 还不如写个资源管理类来使用..., 参见RAII.

检测内存泄漏的有专业工具,如LS所言。

论坛徽章:
0
5 [报告]
发表于 2011-06-24 09:59 |只看该作者
valgrind...
查查资料...
ruchong 发表于 2011-06-23 14:04


valgrind太庞大,想弄个小巧的自己用。

论坛徽章:
0
6 [报告]
发表于 2011-06-24 10:00 |只看该作者
出来地址一样。
noword2k 发表于 2011-06-23 09:34


写了个程序运行了一下,确认一样。
印象中,好像基类对象指针和派生类对象指针有不同的时候啊?!

论坛徽章:
0
7 [报告]
发表于 2011-06-24 10:10 |只看该作者
怎么会不等呢?... 没看明白.

你想自己包装new和delete,使用my_new和my_delete来检测内存泄漏?...... 闻 ...
captivated 发表于 2011-06-24 03:58


简单封装主要是是自己用,不是通用的设计,至少咱程序里能保证只用MY_NEW/MY_DELETE,而不使用new/delete。

论坛徽章:
0
8 [报告]
发表于 2011-06-24 10:17 |只看该作者
给大家推荐LeakTracer,比较小巧。

论坛徽章:
0
9 [报告]
发表于 2011-06-24 11:14 |只看该作者
delete p;
主要有两个动作:
1. 调用c++析构函数。(这个时候p的指针类型就有作用了,但是由于我们的基类析构函数都是虚的,所以析构函数调用是正常的)
2. 调用glibc的free。(这个时候不管你p什么指针类型的效果都一样,即使把p的类型改成void*,char*,int*等)

总结:不知道楼主的例子哪里有泄漏了——

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
10 [报告]
发表于 2011-06-24 13:41 |只看该作者
回复 6# gamblegod

    一个对象的地址始终都是那个地址,怎么会不一样。不一样才见鬼了呢。

    在使用多继承的时候,当在基类和继承类之间进行指针向下强转,这种情况才有可能不一样。
    因为多继承非常复杂,所以我也不是太清楚,请查《Inside the C++ Object Model》.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP