C++中的句柄类
初次在《C++ Primer》看到句柄,不是特别理解。在搜索相关资料后,终于有了点头绪。
首先明白句柄要解决什么问题。参考文章《C++ 沉思录》阅读笔记——代理类
场景:
我们要把继承类绑定到基类的实例对象中
该场景有两个问题需要解决:内存分配和未知对象的绑定
有如下解决方案
- 直接复制继承类对象到基类对象中
问题:很多时候基类是抽象类,无法实例化;不知道继承类是什么类型,其会被当成基类类型,会丢失自身的属性; - 用基类指针存储继承类对象的地址
问题:若继承类对象被释放,则基类指针就成了悬垂指针,指向什么就不知道了 - 使用一个成员函数copy,让继承类告诉别人他自身是什么类;利用该成员函数复制对象到基类对象中
这是一个比较好的解决方案,但仍美中不足:- 复制对象,需要内存开销
- 从设计类的时候就要考虑为类定义成员函数copy
- 考虑引用。但引用会造成一系列更严重的内存管理和安全问题。
- 私有成员包含类指针,使用者不能直接操作类指针,但可以通过句柄类提供的函数使用类的接口函数
- 私有成员包含int指针类型的引用计数值,避免多次复制副本产生大量内存开销
- 计数值为0时,删除副本;
- 计数值首次赋值时,复制原对象,因此即使原对象被删除,也不会出现垂悬指针的问题。
总结:
句柄类避免了使用者接触指针,因此使用者不用考虑其内存管理;句柄类使用引用计数的方式,来避免每次复制都需要拷贝对象。
C++中的句柄类的更多相关文章
- (转)MFC中获得各个类的指针/句柄 ID的总结
http://www.cnblogs.com/ylhome/archive/2009/10/06/1578478.html 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard ...
- code of C/C++(3) - 从 《Accelerated C++》源码学习句柄类
0 C++中多态的概念 多态是指通过基类的指针或者引用,利用虚函数机制,在运行时确定对象的类型,并且确定程序的编程策略,这是OOP思想的核心之一.多态使得一个对象具有多个对象的属性.class Co ...
- 回调函数中使用MFC类的成员或对话框控件的简单方法
在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...
- C#中的bitmap类和图像像素值获取方法
一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...
- [转]Windows中的句柄(handle)
1.句柄是什么? 在windows中,句柄是和对象一一对应的32位无符号整数值.对象可以映射到唯一的句柄,句柄也可以映射到唯一的对象.2.为什么我们需要句柄? 更准确地说,是windows需要 ...
- c++ 容器、继承层次、句柄类
一.容器与继承 在容器中保存有继承关系的对象,如果定义成保存基类对象,则派生类将被切割,如果定义成保存派生类对象,则保存基类对象又成问题(基类对象将被强制转换成派生类对象,而派生类中定义的成员未被初始 ...
- C++ 句柄类
一.容器与继承 在容器中保存有继承关系的对象时,如果定义成保存基类对象,则派生类将被切割,如果定义成保存派生类对象,则保存基类对象又成问题(基类对象将被强制转换成派生类对象,而派生类中定义的成员未被初 ...
- javaAPI中的常用 类 以及接口
java.lang包中的常用类以及接口 类 1. Integer :Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 2. Math ...
- MFC中的句柄
1.引出句柄 CDC问题:1.CDC dc;dc.LineTo(point);无法运行 2.CDC *dc=GetDC();dc->LineTo(point);就可以运行了 MFC中有大量的句柄 ...
随机推荐
- Javascript 链式运动框架——逐行分析代码,让你轻松了解运动的原理
所谓链式运动,就是一环扣一环.我们的很多运动实际上来说指的就是分阶段的,第一个阶段动完,下个阶段开始动. 这个链式运动框架就是用来处理这些问题的. 我们先来看下之前的运动框架,以下是Javascrip ...
- smarty之缓存笔记
smarty缓存技术 在smarty中,缓存分为:普通缓存,单模版都缓存,局部缓存. 缓存:1:首选打开缓存配置项:$smarty->caching=true; 2:缓存生命周期的配置选项:$s ...
- IBM developerWorks 的Ajax系列教程
掌握 Ajax,第 1 部分: Ajax 入门简介 http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html?csrf-799150205 ...
- AJAX+cURL+SimpleXMLElement处理数据
curl_xml.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...
- ajax查询数据的举例
1.根据下拉框的值异步查询信息 HTML代码如下: <script> $(function(){ //页面载入时执行 $("#key").change(function ...
- ThinkPHP框架研究之一 基本函数 M和D的区别
http://my.oschina.net/wxweven/blog/56563?fromerr=32n4Nf7V https://segmentfault.com/q/101000000298807 ...
- Amazon MWS 上传数据 (二) 构造请求
上一篇文章提到了Amazon 上传数据有三个步骤,但是每个步骤都需要构造服务和构造请求,服务是一样的,请求各不相同:这个很容易理解,这三个步骤都需要和Amazon服务器交互,所以他们的服务构造是一样的 ...
- Linux02--文件系统与磁盘管理
1.文件默认权限umask umask命令用于指定新建文件和目录时的默认权限. root的umask默认值是022,普通用户的umask值为002. 新建文件的默认权限=666 - ...
- Emacs配置erlang开发环境(.emacs 文件)
以前都是用sublime写erlang代码,好处不多说,主要是觉得一点不好用,不能实现函数跳转,及其不方便,尤其是代码一多,头疼.后来折腾过IntelliJ,下了个收费$0.00的版本,风格还是挺稀饭 ...
- C#的DLL注册为COM,Delphi来调用
非常实用的东西!过去知道这个方法的话可以解决多少问题啊 首先建立一个C#的DLL工程,写一个类 //Test.csnamespace Test...{public class MyTest...{pu ...