智能指针实际上就是通过模板技术实现的一个类

内存泄露(臭名昭著的Bug)——在软件开发和测试阶段都不容易被发现
-动态申请堆空间,用完后不归还
-C++语言中没有垃圾回收的机制
-指针无法控制所指堆空间的生命周期

当代C++软件平台中的智能指针
-指针生命周期结束时主动释放堆空间
-一片堆空间最多只能由一个指针标识

-杜绝指针运算和指针比较

智能指针的设计方案
-通过类模板描述指针的行为
  能够定义不同类型的指针对象
-重载指针特征操作符(->和*)
  利用对象模拟原生指针的行为

SmartPointer.h

#ifndef SMARTPOINTER_H_
#define SMARTPOINTER_H_namespace DTLib
{
template <typename T>
class SmartPointer
{
protected:T* m_pointer;
public:SmartPointer(T* p =NULL){m_pointer = p;}T* operator ->(){return m_pointer;}T& operator *(){return *m_pointer;}SmartPointer(const SmartPointer<T>& obj){m_pointer = obj.m_pointer;const_cast<SmartPointer<T> &>(obj).m_pointer = NULL;}SmartPointer<T>& operator = (const SmartPointer<T>& obj){if(this != &obj){delete m_pointer;m_pointer = obj.m_pointer;const_cast<SmartPointer<T> &>(obj).m_pointer = NULL;}return *this;   //可以支持连续赋值}T* get(){return m_pointer;}bool isNull(){return (m_pointer == NULL);}~SmartPointer(){delete m_pointer;}};}#endif // SMARTPOINTER_H_

main.cpp

#include <iostream>
#include "SmartPointer.h"using namespace std;
using namespace DTLib;class Test
{
public:Test(){cout << "Test()" << endl;}~Test(){cout << "~Test()" << endl;}};int main()
{SmartPointer<Test> sp = new Test();SmartPointer<Test> nsp;nsp = sp;cout << sp.isNull() << endl;cout << nsp.isNull() << endl;cout << "sp = " << sp.get() << endl;cout << "nsp = " << nsp.get() << endl;return 0;
}

c++智能指针 示例讲解相关推荐

  1. C++---智能指针原理讲解

    为什么需要智能指针 在写代码的时候,从堆上申请的空间,由于一些原因(代码中途异常),没有得到释放,从而导致代码出现内存泄漏,所以为了防止此类问题的出现,从而出现智能指针.采用智能指针可以自动检测,指针 ...

  2. 智能指针实战讲解--龙之介《Effective C++》实验室

    条款13 以对象管理资源 在C++中 我们申请资源(new) 之后需要手动释放资源(delete) Test* t = new Test();//申请资源......delete t;//释放资源 但 ...

  3. C++智指针之——boost::intrusive_ptr,一种与shared_ptr、unique_ptr截然不同的智能指针

    智能指针boost::shared_ptr/std::shared_ptr使用了和数据无关的引用计数,在使用shared_ptr之前,必须要搞清楚资源的所有权和资源的使用权这两个问题(详见<C+ ...

  4. 智能指针的用法shared_ptr

    目录 智能指针 shared_ptr共享的智能指针 shared_ptr的基本用法 1.初始化 reset成员函数 make_shared swap()函数 2. 获取原始指针(get()) 3. 指 ...

  5. 【C++ 语言】智能指针 引入 ( 内存泄漏 | 智能指针简介 | 简单示例 )

    文章目录 I . 智能指针 引入 II . 智能指针 简介 III . 智能指针 简单示例 I . 智能指针 引入 1 . 示例前提 : 定义一个 Student 类 , 之后将该类对象作为智能指针指 ...

  6. C++ 智能指针 unique_ptr 详解与示例

    unique_ptr 是 C++ 11 提供的用于防止内存泄漏的智能指针中的一种实现,独享被管理对象指针所有权的智能指针.unique_ptr对象包装一个原始指针,并负责其生命周期.当该对象被销毁时, ...

  7. C++智能指针中unique_ptr部分内容的讲解

    参考链接 std::unique_ptr 介绍 定义位于头文件<memory> std::unique_ptr 是通过指针占有并管理另一对象,并在 unique_ptr 离开作用域时释放该 ...

  8. 五点讲述C++智能指针的点点滴滴

    (在学习C/C++或者想要学习C/C++可以加我们的学习交流QQ群:712263501群内有相关学习资料) 0.摘要 本文先讲了智能指针存在之前C++面临的窘境,并顺理成章地引出利用RAII技术封装普 ...

  9. 浅谈auto_ptr智能指针

    引入智能指针: 智能指针的实现原理: 资源分配即初始化RAII(Resource Acquisition Is Initialization): 定义一个类来封装资源的分配和释放,在构造函数完成资源的 ...

最新文章

  1. 混合线性模型+mixed linear model+GEEs+GLMM+LMM
  2. 通过“四大行为”对WCF的扩展[原理篇]
  3. 让你受用一辈子的181句话
  4. android卡片层叠效果_ReactNative之Android绝对布局position:#x27;absolute#x27;问题
  5. 最近都在谈的「私域流量」,究竟有没有前途?
  6. js javascript 判断字符串是否包含某字符串,String对象中查找子字符,indexOf
  7. Java Mysql工具类封装
  8. 用java设计一个矩形类_6-1 设计一个矩形类Rectangle (10分)
  9. 使用VMware虚拟机搭建爱快路由器PPPoE服务器环境
  10. 计算机操作测试题及答案,计算机操作系统期末考试题及答案-
  11. java8中的Collectors.groupingBy用法
  12. 搜狗输入法的使用感受与评价
  13. 饿了么前端教程简明笔记
  14. 使用PWM信号实现呼吸灯(IDE+Protuse)
  15. window编译最新的spiderMonkey
  16. logic pro x 下载
  17. 专科出身,苦学Android,最终圆梦阿里,2021最新Android框架体系架构面试题
  18. 数据仓库ETL工具箱——元数据
  19. 布隆过滤器(亿级数据过滤算法)
  20. C# Media Player控件(转)

热门文章

  1. linux shell case语句
  2. 使用Nessus漏扫
  3. Windows Socket五种I/O模型——代码全攻略
  4. Linux程序映像的布局
  5. 对网上花店系统进行软件测试,网上花店系统
  6. 特性开关框架 java_关于Mosfet你应当知道的开关特性
  7. matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同
  8. mysql 5.5 5.6差异,MySQL5.5和MySQL5.6授权区别
  9. 服务器被非法上传文件,DiscuzX没有合法的文件被上传的修复方法
  10. 二叉搜索树的最近祖先