初次在《C++ Primer》看到句柄,不是特别理解。在搜索相关资料后,终于有了点头绪。

首先明白句柄要解决什么问题。参考文章《C++ 沉思录》阅读笔记——代理类

场景:

我们要把继承类绑定到基类的实例对象中

该场景有两个问题需要解决:内存分配和未知对象的绑定

有如下解决方案

  1. 直接复制继承类对象到基类对象中
    问题:很多时候基类是抽象类,无法实例化;不知道继承类是什么类型,其会被当成基类类型,会丢失自身的属性;
  2. 用基类指针存储继承类对象的地址
    问题:若继承类对象被释放,则基类指针就成了悬垂指针,指向什么就不知道了
  3. 使用一个成员函数copy,让继承类告诉别人他自身是什么类;利用该成员函数复制对象到基类对象中 
    这是一个比较好的解决方案,但仍美中不足:
    1. 复制对象,需要内存开销
    2. 从设计类的时候就要考虑为类定义成员函数copy
  4. 考虑引用。但引用会造成一系列更严重的内存管理和安全问题。
这个时候句柄就派上用场了。参考文章: 《C++ 沉思录》阅读笔记——句柄类
句柄
  1. 私有成员包含类指针,使用者不能直接操作类指针,但可以通过句柄类提供的函数使用类的接口函数
  2. 私有成员包含int指针类型的引用计数值,避免多次复制副本产生大量内存开销
    1. 计数值为0时,删除副本;
    2. 计数值首次赋值时,复制原对象,因此即使原对象被删除,也不会出现垂悬指针的问题。

总结:

句柄类避免了使用者接触指针,因此使用者不用考虑其内存管理句柄类使用引用计数的方式,来避免每次复制都需要拷贝对象。

C++中的句柄类的更多相关文章

  1. (转)MFC中获得各个类的指针/句柄 ID的总结

    http://www.cnblogs.com/ylhome/archive/2009/10/06/1578478.html 一般我们使用的框架是VC提供的Wizard生成的MFC App Wizard ...

  2. code of C/C++(3) - 从 《Accelerated C++》源码学习句柄类

    0  C++中多态的概念 多态是指通过基类的指针或者引用,利用虚函数机制,在运行时确定对象的类型,并且确定程序的编程策略,这是OOP思想的核心之一.多态使得一个对象具有多个对象的属性.class Co ...

  3. 回调函数中使用MFC类的成员或对话框控件的简单方法

    在MFC的很多程序中,常常需要在回调函数中调用MFC类的类成员变量.类成员函数,亦或者对话框控件的句柄.由于回调函数是基于C编程的Windows SDK的技术,而类成员又有this指针客观条件限制.. ...

  4. C#中的bitmap类和图像像素值获取方法

    一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetP ...

  5. [转]Windows中的句柄(handle)

    1.句柄是什么?   在windows中,句柄是和对象一一对应的32位无符号整数值.对象可以映射到唯一的句柄,句柄也可以映射到唯一的对象.2.为什么我们需要句柄?   更准确地说,是windows需要 ...

  6. c++ 容器、继承层次、句柄类

    一.容器与继承 在容器中保存有继承关系的对象,如果定义成保存基类对象,则派生类将被切割,如果定义成保存派生类对象,则保存基类对象又成问题(基类对象将被强制转换成派生类对象,而派生类中定义的成员未被初始 ...

  7. C++ 句柄类

    一.容器与继承 在容器中保存有继承关系的对象时,如果定义成保存基类对象,则派生类将被切割,如果定义成保存派生类对象,则保存基类对象又成问题(基类对象将被强制转换成派生类对象,而派生类中定义的成员未被初 ...

  8. javaAPI中的常用 类 以及接口

    java.lang包中的常用类以及接口 类 1. Integer :Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的字段. 2. Math ...

  9. MFC中的句柄

    1.引出句柄 CDC问题:1.CDC dc;dc.LineTo(point);无法运行 2.CDC *dc=GetDC();dc->LineTo(point);就可以运行了 MFC中有大量的句柄 ...

随机推荐

  1. 使用Python多线程犯的错误总结

    在使用Python多线程的时候,在使用多线程编程的时候,由于对于变量作用域和多线程不是很熟悉,导致在使用多线程的时候,犯了低级的错误. 第一个错误: 在多线程中使用全局变量,导致多个线程修改全局变量. ...

  2. mvc 跳转到另一个页面 Controller带参数

    跳转到链接    // Controller        public ActionResult Detail(int MessageId)        {             BLL.ZQS ...

  3. Oracle EBS-SQL (WIP-4):检查检查成品标准作业是否勾选"固定"标识.sql

    select WE.DESCRIPTION                                                                   任务说明,        ...

  4. POJ 1759 Garland(二分答案)

    [题目链接] http://poj.org/problem?id=1759 [题目大意] 有n个数字H,H[i]=(H[i-1]+H[i+1])/2-1,已知H[1],求最大H[n], 使得所有的H均 ...

  5. Linux下的Oracle 11gr2安装完成的的自启动操作。

    Linux下的Oracle在安装结束后是处于运行状态的.重启机器后,Oracle不会像在Windows下那样将Oracle添加到Windows服务,在linux下需要手动启动Orcle服务 以orac ...

  6. 二叉查找树的Insert和Delete操作

    struct TreeNode{ SearchTree Left; SearchTree Right; ElementType Ele; }; /*递归一定有出口*/ /*递归代码就是要重复使用*/ ...

  7. #include <stdbool.h>

    可以使用bool和true.false 输出是1或者0 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdb ...

  8. 可用的CSS文字两端对齐

    最近在工作项目中接触到Web界面设计的问题,要实现文字两端对齐的效果.在网上搜索了一下,用的都是类似的技巧: text-align:justify;text-justify:inter-ideogra ...

  9. Semantic UI基础使用教程

    自己今后要使用Semantic UI进行项目开发了,一步步的记录下来,供大家参考,也让自己去简单的学习一下,有空了就会更新一点东西,大家有什么问题可以相互交流一下,文采不是很好,希望大家要多多见谅,这 ...

  10. FAQ:win7和win8 64位注册ocx控件方法

    win7/win8 问题所在: 64位的系统一般都是可以安装32位程序的, 执行         C:\Windows\SysWOW64\regsvr32.exe 而不是 C:\Windows\Sys ...