• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C++ 智能指针深入解析

C++ 智能指针深入解析

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++智能指针,c++ void指针,c++中指针的用法,c++文件指针,c++指针等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1. 为什么需要智能指针?
简单的说,智能指针是为了实现类似于Java中的垃圾回收机制。Java的垃圾回收机制使程序员从繁杂的内存管理任务中彻底的解脱出来,在申请使用一块内存区域之后,无需去关注应该何时何地释放内存,Java将会自动帮助回收。但是出于效率和其他原因(可能C++设计者不屑于这种傻瓜氏的编程方式),C++本身并没有这样的功能,其繁杂且易出错的内存管理也一直为广大程序员所诟病。

更进一步地说,智能指针的出现是为了满足管理类中指针成员的需要。包含指针成员的类需要特别注意复制控制和赋值操作,原因是复制指针时只复制指针中的地址,而不会复制指针指向的对象。当类的实例在析构的时候,可能会导致垂悬指针问题。

管理类中指针成员的方法一般有两种方式:一种是采用值型类,这种类是给指针成员提供值语义(value semantics),当复制该值型对象时,会得到一个不同的新副本。这种方式典型的应用是string类。另外一种方式就是智能指针,实现这种方式的指针所指向的对象是共享的。

2. 智能指针的实现概述
智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。
每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。
实现智能指针有两种经典策略:一是引入辅助类,二是使用句柄类。

3. 实现方式1:引入辅助类
这种方式定义一个单独的具体类(RefPtr)来封装指针和相应的引用计数。
为了避免上面方案中每个使用指针的类自己去控制引用计数,可以用一个类把指针封装起来。封装好后,这个类对象可以出现在用户类使用指针的任何地方,表现为一个指针的行为。我们可以像指针一样使用它,而不用担心普通成员指针所带来的问题,我们把这样的类叫句柄类。在封装句柄类时,需要申请一个动态分配的

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++中this指针用法详解及实例
  • 关于c++ 智能指针及 循环引用的问题
  • C++智能指针读书笔记
  • 剖析C++编程当中指针作为函数参数的用法
  • 深入解读C++中的指针变量
  • C++基础入门教程(九):函数指针之回调
  • C++基础入门教程(八):函数指针
  • C++普通函数指针与成员函数指针实例解析
  • c++回调之利用函数指针示例
  • C++中的对象指针总结

相关文章

  • 2017-05-28Windows网络编程之winsock实现文件传输示例
  • 2017-05-28VC++植物大战僵尸中文版修改器实现代码
  • 2017-05-28STL区间成员函数及区间算法总结
  • 2017-05-28C++发送HTTP请求的实现代码
  • 2017-08-27ZOJ 3329 One Person Game (期望DP)
  • 2017-05-28sqlserver,sqlite,access数据库链接字符串整理
  • 2017-05-28输入一个字符串,取出其中的整数(实现代码)
  • 2017-05-28C语言 以数据块的形式读写文件详解及实现代码
  • 2017-05-28C++利用容器查找重复列功能实现
  • 2017-05-28c语言B树深入理解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 在C语言中使用对数函数的方法
    • C++基于递归和非递归算法求二叉树镜像的方法
    • floyd算法实现思路及实例代码
    • C语言中获取进程识别码的相关函数
    • 纯C语言实现五子棋
    • C语言中改变目录的相关操作函数详解
    • c语言实现奇偶排序算法
    • 详解C语言 三大循环 四大跳转 和判断语句
    • MFC之ComboBox控件用法实例教程
    • C++类和对象实例解析(二)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有