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

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

类的前向声明PIMPL  

2014-05-04 13:31:01|  分类: UML+设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

类的前向声明PIMPL

参考:C++ 工程实践(5):避免使用虚函数作为库的接口

http://blog.csdn.net/solstice/article/details/6244905

PIMPL机制

http://fpcfjf.blog.163.com/blog/static/5546979320115132230699/

PIMPL原理

http://fpcfjf.blog.163.com/blog/static/55469793201141125315125/

 

前面谈过PIMPL,这个东西确实不错,很多大牛都在推荐,但是这个东西是有陷阱的,如果一不小心就会发生错误,看下面的例子:

#pragma once

class Ap;

class TestFrontDeclare

{

public:

         TestFrontDeclare(Ap*p);

         ~TestFrontDeclare();

         void Test();

         Ap*_ap;

};

#include "TestFrontDeclare.h"

//#include "de.h"

 

TestFrontDeclare::TestFrontDeclare(Ap*p)

{

         _ap= p;

}

 

 

TestFrontDeclare::~TestFrontDeclare()

{

}

void TestFrontDeclare::Test()

{

         delete _ap;

}

De.h

#pragma once

#include <iostream>       // std::cout

class Ap;

static void del(Ap *ptr)

{

         delete ptr;

}

 

 

class Ap

{

public:

         Ap(){ std::cout << "A" << std::endl; }

         ~Ap(){ std::cout << "~A" << std::endl; }

};

如果这样使用的话,编译器会报两个警告:内容一样:

warning C4150: 删除指向不完整“Ap”类型的指针;没有调用析构函数  

如果你下断点跟一下,发现,确实是跟不到析构函数中去的。同样,如果你在没有包含头文件的情况下使用new这个类型 ,也会报找不到相应的构造函数,不过那个就不是警告而直接是错误了。

只要把注释的#include “de.h”解开注释,那么就可以发现可以跟到类的析构函数中去了。那么如果没有包含头文件,delete会不会成功呢,是可以的,但是有一个致命的问题,他虽然是删除了内存,但是并没有回收到系统中去,因为没有调用析构函数,所以系统根本不知道这块内存已经被删除了,然后就是想当然的内存泄露。

这也说明在使用PIMPL这咱设计方式时,一定要引起注意,特别是想自己集中进行内存管理时,一定要慎之又慎。防止出现这种现象。

这还是细节。

  评论这张
 
阅读(427)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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