delete this,dll导出类及如何写plugins(PART I)

原创 2001年07月12日 09:38:00

 
1.为什么要使用delete this,以及如何使用。
(1)考查这样的情况:
有两个对象A,B需要访问同一个多态对象C。
因为C一般是通过new 操作构造的,一定要自己释放,但是对象A,B都需要使用它,并且B不知道A什么时候使用完成C,A也不知道B什么时候使用完成C(当然可以用函数通信的方法通知了,不过是一个比较丑陋的实现方法),所以不能在A/B中间来delete,
一个折中的办法是在程序退出的时候来delete,但是这样做不到资源的立即释放,假如有多个A/B/C会有比较大的运行开销。
解决的办法就是在C中增加引用计数,并且自己决定什么时候来释放自己:

下面是代码
struct c{
C(){nRef=1;};
int AddRef(){
return ++nRef;
}
int Release(){
if(!--nRef)
{
 delete this;
 return 0;
}
return nRef;
}
protected:
virtual~c()//donot allow delete from outsides
{
}
int nRef;
};

就是通过C内部的计数来判断什么时候释放自己的资源。当然需要A/B在适当时候调用AddRef/Release了。
下面是一个简单的实现。
struct a{
a(c* pc)
{
m_pc=pc;
pc->AddRef();
}
void do_Sth(){
;//...使用完成m_pc了
m_pc->Release();
m_pv=NULL;
}
protected:
c* m_pc;
}
class b的结构和a也差不多,就不写了
下面是main函数:
void main()
{
c* pc=new c;
a clsA(pc);
b clsB(pc);
pc->Release();//ok pc was hold by both clsA and clsB,so we don't need it.release.
pc=NULL;
a.do_sth();
b.do_sth();
;//should no memory leak
}


注意事项
因为是在类成员函数里面delete this的,所以在此语句以后,不能访问任何的成员变量及虚函数,否则一定非法。


另外的一个用处将在后面说明。



 

在Unity中引用Dll的两种方法

Unity3D 能够很方便的集成一些外部插件,以便调用现有的动态链接库。下面会介绍Unity中如何集成Dll的两种方法。 1.   标准引用 这里所使用的语言是C#。 1.1   新建C#类库项...
  • zhaoguanghui2012
  • zhaoguanghui2012
  • 2016年03月16日 21:45
  • 12296

怎样从一个DLL中导出一个C++类

原文来源: http://www.codeproject.com/KB/cpp/howto_export_cpp_classes.aspx 译文来源:http://blog.csdn.ne...
  • CNHK1225
  • CNHK1225
  • 2015年08月07日 10:29
  • 1981

MFC扩展DLL中导出类和对话框的实现方法

本文实例讲述了MFC扩展DLL中导出类和对话框的实现方法,分享给大家供大家参考。具体实现方法如下: 一般来说,如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改...
  • ldkcumt
  • ldkcumt
  • 2015年09月15日 10:39
  • 1093

编译VC++类的动态链接库DLL 导出类及其中的函数

如果已经写好了一个C++的类,希望把它做成dll动态链接库,这里介绍一种简单的方法。      1、制作dll      利用VC6新建工程时选择win32 dynamic-Link Libr...
  • liqunsoft
  • liqunsoft
  • 2011年12月29日 11:50
  • 473

Error in initialization of native part of the Colorer library. This can be caused by absent net_sf_colorer.dll 报错

  • 2009年04月22日 07:17
  • 697B
  • 下载

谈谈vc如何写dll(封装性,隐藏头文件,私有成员)

最近项目进行到一定阶段,老板要求把已完成部分分离开并把各模块封装成dll。用vs开发dll当然很简单,是用vs的向导可以很快写一个dll.但是我遇到了一些问题:刚开始只需要把各个模块的头文件和cpp加...
  • caiqi1123
  • caiqi1123
  • 2012年06月14日 19:19
  • 1693

谈谈vc如何写dll(封装性,隐藏头文件,私有成员) .

(转)谈谈vc如何写dll(封装性,隐藏头文件,私有成员) . 最近项目进行到一定阶段,老板要求把已完成部分分离开并把各模块封装成dll。用vs开发dll当然很简单,是用vs的向导可以很快写...
  • jfkidear
  • jfkidear
  • 2012年02月11日 15:34
  • 635

如何写好.babelrc?Babel的presets和plugins配置解析

(点击上方公众号,可快速关注) 作者:韩小平 excaliburhan.com/post/babel-preset-and-plugins.html 如果好文章投稿,...
  • VhWfR2u02Q
  • VhWfR2u02Q
  • 2017年12月02日 00:00
  • 48

This shows how to disable control alt and delete by tricking

  • 2006年02月23日 09:05
  • 2KB
  • 下载

如何写DLL文件及调用DLL文件

原文地址:http://panxianjin.dream.blog.163.com/blog/static/12635274620099293578769/ 1.写DLL 打开...
  • pyjfoot
  • pyjfoot
  • 2012年12月08日 19:49
  • 838
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delete this,dll导出类及如何写plugins(PART I)
举报原因:
原因补充:

(最多只允许输入30个字)