C++中的句柄类

C++中的句柄类初次在 C Primer 看到句柄 不是特别理解 在搜索相关资料后 终于有了点头绪 首先明白句柄要解决什么问题 参考文章 C 沉思录 阅读笔记 代理类场景 我们要把继承类绑定到基类的实例对象中该场景有两个问题需要解决 内存分配和未知对象的绑定有如下解决方案直接复制继承类对象到基类对象中问题 很多时候基类是抽象类 无法实例化 不知道继承类

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

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

场景:

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

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

  1. 直接复制继承类对象到基类对象中
    问题:很多时候基类是抽象类,无法实例化;不知道继承类是什么类型,其会被当成基类类型,会丢失自身的属性;
  2. 用基类指针存储继承类对象的地址
    问题:若继承类对象被释放,则基类指针就成了悬垂指针,指向什么就不知道了
  3. 使用一个成员函数copy,让继承类告诉别人他自身是什么类;利用该成员函数复制对象到基类对象中
    这是一个比较好的解决方案,但仍美中不足:
    1. 复制对象,需要内存开销
    2. 从设计类的时候就要考虑为类定义成员函数copy


  4. 考虑引用。但引用会造成一系列更严重的内存管理和安全问题。
这个时候句柄就派上用场了。参考文章:  《C++ 沉思录》阅读笔记——句柄类
句柄
  1. 私有成员包含类指针,使用者不能直接操作类指针,但可以通过句柄类提供的函数使用类的接口函数
  2. 私有成员包含int指针类型的引用计数值,避免多次复制副本产生大量内存开销
    计数值为0时,删除副本;
    计数值首次赋值时,复制原对象,因此即使原对象被删除,也不会出现垂悬指针的问题。

总结:

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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232184.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 复试题–smith数

    复试题–smith数

    2021年5月19日
    109
  • C语言必背18个经典程序,2022年C语言必背100代码大全

    C语言必背18个经典程序,2022年C语言必背100代码大全对于c语言来说,要记得东西其实不多,基本就是几个常用语句加一些关键字而已。你所看到的那些几千甚至上万行的代码,都是用这些语句和关键词来重复编写的。只是他们逻辑功能不一样,那如何快速的上手C语言代码,建议多看多写,下面是小编整理的C语言必背18个经典程序。

    2022年6月17日
    101
  • 2021了,真的不要再说 Node.js 是一门编程语言了「建议收藏」

    2021了,真的不要再说 Node.js 是一门编程语言了「建议收藏」Node.js全栈基础1.Node.js光速入门1.1Node.js概述Node.js是什么Node.js不是一门编程语言,它是一个执行JavaScript代码的工具。工具是指可以安装在计算机操作系统之上的软件。为什么浏览器和Node.js都可以运行JavaScript因为浏览器和Node.js都内置了JavaScriptV8Engine。它可以将JavaScript代码编译为计算机能够识别的机器码。3.浏览器中运行的JavaScrip

    2022年7月16日
    17
  • python中二维列表取值_python二维元组元素的提取

    python中二维列表取值_python二维元组元素的提取直接切片是不行的:>>>a=[[1,2,3],[4,5,6]]>>>a[:,0]#尝试用数组的方法读取一列失败TypeError:listindicesmustbeintegersorslices,nottuple我们可以直接构造:>>>b=[i[0]…

    2025年7月1日
    7
  • 关于二叉树的前序、中序、后序三种遍历

    二叉树遍历分为三种:前序、中序、后序,其中序遍历最为重要。为啥叫这个名字?是根据根节点的顺序命名的。比如上图正常的一个满节点,A:根节点、B:左节点、C:右节点,前序顺序是ABC(根节点排最先,然后同级先左后右);中序顺序是BAC(先左后根最后右);后序顺序是BCA(先左后右最后根)。    比如上图二叉树遍历结果   前序遍历:ABCDEFGHK    中序遍历:BDCAEHGKF    后序…

    2022年4月9日
    61
  • redis连接时报错:Could not connect to Redis at 192.168.1.21:6379: Connection refused

    redis连接时报错:Could not connect to Redis at 192.168.1.21:6379: Connection refusedbrewinstallredis安装好redis用terminal连接redis查看状态时时出现错误:[root@admin2bin]#redis-cli-h192.168.1.21infoReplicationCouldnotconnecttoRedisat192.168.1.21:6379:Connectionrefused但是查看127.0.0…

    2022年6月3日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号