注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识68——虚析构函数的小坑  

2015-11-19 21:44:56|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C++小知识68——虚析构函数的小坑

析构函数的Virtual化,有什么好处,这里面就不提了,在前面也谈到过,在什么情况下析构函数是虚拟化,有兴趣的大家可以回头查一下“c++小知识18——什么情况下析构函数才需要声明成virtual。”
因为做一个接口,使用一个抽象类来做为外放的接口,但内部其实是生产出来的实际类的对象。这样在实际使用时,delete papi;一开始没有注意,在整个的程序循环都OK后,在做压力测试时发现了问题,内存泄露的杠杠的,大约两分钟左右,程序挂掉或者干脆虚拟机

都挂掉了。
一开始以为是调用的API内部的内存没有释放,结果在查找的过程中忽然想到是不是析构函数没有虚拟化造成的,看下面的代码:


class MemData
{
public:
char data[1024*1024];
};
class IBase
{
public:
IBase() {}
virtual ~IBase() {}
};
class BaseMem:public IBase
{
public:
BaseMem() { p = new char[1024 * 1024 * 5];memset(p,0,1024*1024*5); }
virtual ~BaseMem() { delete p; }
public:
char*p;
char*buf[1000*1000*2];
};

class TestMem :public BaseMem
{
public:
TestMem() {}
virtual ~TestMem() {}
public:
MemData md;
};



void Test()
{
IBase * p = new TestMem();
printf("--------------------------------\n");
delete p;
}
int main()
{
while (true)
{
Test();
Sleep(2000);
}

    return 0;
}
如果把Virtual去除,内存那是杠杠的上去啊。原理这里不细说,大家应该都不明白,不明白的回去恶补C++的知识。于是想到是不是接口的代码是手动敲的会不会也有这个问题,结果一查,没有。无语。看来还真是API内部的问题啊,果不其然,内存的释放的函数在接口

里没有挂上。这种事出了多少回了。
细节,要注意啊。
  评论这张
 
阅读(199)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017