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

原创 2004年09月22日 15:09: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的,所以在此语句以后,不能访问任何的成员变量及虚函数,否则一定非法。


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

C++动态库(Dll)的制作,导出类

1、完成类的封装: 如:CMyTestClass类/// CMyTestClass.h头文件中 /**************************************************...
  • bao_bei
  • bao_bei
  • 2016年06月03日 16:24
  • 2544

DLL导出类和导出函数

1、动态库DLL中的类或者函数有时候要被其他的库调用,因此需要被其他库调用的类或者函数需要进行导出。 2、首先编写需要导出的DLL,新建一个工程设置应用程序类型为DLL 3、类的代码如下 ...
  • goodluckMT
  • goodluckMT
  • 2016年09月28日 16:05
  • 2779

DLL入门浅析(4)——从DLL中导出类

DLL头文件:#ifndef _DLL_SAMPLE_H #define _DLL_SAMPLE_H // 通过宏来控制是导入还是导出 #ifdef _DLL_SAMPLE #define...
  • cbacq
  • cbacq
  • 2016年04月26日 09:04
  • 1260

从dll中导出c++类

简介: 动态库(DLL)从开始就作为windows平台的组成部分而存在。它以独立的模块把c函数封装起来供其他用户使用 。DLL从开始就是以封装C语言的形式而存在,当然现在你也可以封装其他语言,比如c...
  • amyeric
  • amyeric
  • 2014年08月01日 16:42
  • 2914

MFC扩展DLL导出对话框类的实现---VS2005

基于深入浅出讲的比较泛,根据找到的网上的资料的修改,因为真正实践发现不少资料有小bug。总结出下面两个例子: Demo 1 点击较多的这篇MFC扩展DLL导出对话框类,做了少量修改 【在网上看了一...
  • shannonDJ
  • shannonDJ
  • 2016年03月13日 23:40
  • 1632

Qt导出C++类和Qt静态方式加载DLL

本文主要介绍如何使用QCreator新建包含Qt库的C++导出类(DLL)和如何在Qt工程中调用DLL中的C++类。整个实验的步骤如下: 一、宿主工程(调用者) 1,打开QCreator,新建一个...
  • Sagittarius_Warrior
  • Sagittarius_Warrior
  • 2016年12月13日 16:25
  • 1584

C++ DLL总结—静动态调用、导出类

1、 DLL的概念 DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。 静态链接库与动态链接库的区别: (1)静态链...
  • WaitForFree
  • WaitForFree
  • 2014年07月19日 11:03
  • 4224

c#调用C++写的dll导出类,如何实现

网上看了一些都是调用c++写函数能不能实现c#使用c++写的类各位高手请赐教 解决方案 » 类的有一个成员函数,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管。然后C++...
  • CCCstudyer
  • CCCstudyer
  • 2014年11月21日 14:17
  • 4036

C++ DLL导出类

C++ DLL导出类 http://blog.csdn.net/jietoulangren/article/details/14052533 在公司使用C++ 做开发,公司的大拿搭了一个C++的跨平...
  • CSDNMicrosoftCSDN
  • CSDNMicrosoftCSDN
  • 2016年03月21日 16:37
  • 2045

动态链接库(DLL)总结---从DLL中导出类(6)

我们创建一个工程动态链接库,名称为DLL1,然后在DLL1.h中添加代码如下: #ifdef DLL1_API_IMP #else #define DLL1_API_IMP __declspec...
  • oBuYiSeng
  • oBuYiSeng
  • 2015年12月01日 08:50
  • 1622
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:delete this,dll导出类及如何写plugins(PART I) [转]
举报原因:
原因补充:

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