免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: llj
打印 上一主题 下一主题

delete对象的内存泄露问题 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-11-07 09:24 |只看该作者
看看父类的析构函数是不是没有写成虚函数.

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
22 [报告]
发表于 2011-11-07 11:20 |只看该作者
我看LZ的意思,貌似是这样的:
class A {
public:
    int a;   
};
class B{
public:
    B() { pA = new A; }
    ~B() { printf("B::~B"); }
    Delete() {delete this; }
    A* pA;
};
int main(int, char**)
{
    B* pB = new B;
    //...
    pB->Delete();
    return 0;
}
如果确实是与此类似的话,pB->Delete()里面的delete this,只是把main里面的new B释放了,但是B::B()里面的new A却没有人释放,就算B::~B被调用,但这个new A是不会被自动释放的

论坛徽章:
0
23 [报告]
发表于 2011-11-07 11:58 |只看该作者
说了这么多 感觉在猜灯迷 不如直接上代码靠谱

论坛徽章:
0
24 [报告]
发表于 2011-11-07 13:47 |只看该作者
new和delete必须成对。谁写了new,谁就必须要保证对应的delete被调用。

论坛徽章:
0
25 [报告]
发表于 2011-11-07 15:58 |只看该作者
回复 24# 狗蛋


    placement new?

论坛徽章:
1
双子座
日期:2014-08-29 17:15:03
26 [报告]
发表于 2011-11-07 16:02 |只看该作者
我看LZ的意思,貌似是这样的:
class A {
public:
    int a;   
};
class B{
public:
    B() { pA ...
w_anthony 发表于 2011-11-07 11:20



    楼主不至于这么弱的吧

论坛徽章:
0
27 [报告]
发表于 2011-11-07 16:26 |只看该作者
回复  狗蛋


    placement new?
幻の上帝 发表于 2011-11-07 15:58



    还没到这个程度

就是最基本的编程规范:new和delete必须成对。谁new的,谁就负责delete。

或者说,一切资源的分配和归还都要遵循这个原则:怎么申请的,怎么归还;谁申请的,就由谁归还(如果做不到,就写文档着重指出——能带些脏字的话效果更为显著 )。

他这个问题很简单。外部对象析构了(有日志),内部对象还在。估计只要照着这个原则认真捋一捋,问题就找到了。


嗯,还有个地方一下子没想到:不要玩那么多的继承层次。如果玩的话,请保证基类析构函数是虚函数。否则……

论坛徽章:
0
28 [报告]
发表于 2011-11-07 21:29 |只看该作者
首先非常感谢大家热情的帮助。

这个问题, 在今天尝试了一些方法(比如, 把里面的成员对象问题先注释等),加调试代码, 代码review,最后把问题找到了。  代码类似这样的:

class A
{
public :
A() :count(1) {}

ref() { count++ }

unref() { --count; if( 0==count ) delete this; }

virtual ~A() {}

private :
Atomic count;
}

class B public A
{
public :
B() {}
virtual ~B() {}
}

main()
{
  A* b = new B() ;
b->unref();
}

这段代码这样析构是没有问题的。

但是, 在复杂环境下,比如多线程, 业务逻辑复杂度, 还有开发人员之间的沟通, 模块调用等等,

就会在使用过程中,倒置一些很奇怪的现象。


这次的这个问题, 就是在模块之间接口的使用,产生了一些问题, 倒置内存泄漏, 现象比较乱,不太好定位。

再次感谢大家!

论坛徽章:
0
29 [报告]
发表于 2011-11-07 22:35 |只看该作者
2楼说的有理 ,主要看它们的对应关系。

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
30 [报告]
发表于 2011-11-08 09:33 |只看该作者
首先非常感谢大家热情的帮助。

这个问题, 在今天尝试了一些方法(比如, 把里面的成员对象问题先注释等 ...
llj 发表于 2011-11-07 21:29



有多线程的话,这样ref和unref本身就有问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP