文章目录

  • 前言
  • 一、RAII
  • 二、裸指针
    • 1.裸指针是什么
    • 2.裸指针所带来的问题、
  • 三、智能指针
    • 1.智能指针的种类
    • 2.unique_ptr
  • 总结

前言

浅谈智能指针


提示:以下是本篇文章正文内容,下面案例可供参考

一、RAII

二、裸指针

1.裸指针是什么

由类型直接定义的指针。比如:

2.裸指针所带来的问题、

1.难以区分指向的是单个对象还是一个数组;
2.使用完指针之后无法判断是否应该销毁指针, 因为无法判断指针是否"拥有” 指向的对象;
3.在已经确定需要销毁指针的情况下,也无法确定是用delete关键字删除,还是有其他特殊的销毁机制,例如通过将指针传入某个特定的销毁函数来销毁指针;
4.即便已经确定了销毁指针的方法,由于1的原因,仍然无法确定到底是用delete(销毁单个对象)还是delete[(销毁一个数组);
5.假设上述的问题都解决了,也很难保证在代码的所有路径中(分支结构,异常导致的跳转),有且仅有一次销毁指针操作;任何一条路径遗漏都可能导致内存泄露,而销毁多次则会导致未定义行为;
6.理论上没有方法来分辨一个指针是否处于悬挂状态;


无法判断裸指针指向的是一个对象还是一组对象,同样析构时亦无法判断是用delete还是delete[]

三、智能指针

1.智能指针的种类


其中auto_ptr已经被移除,主要原因在于拷贝构造函数意义不明确。同时析构函数也不能判断是析构一个对象还是一组对象。
拷贝构造函数第一种写法:

这样导致两个对象拥有同样的资源,在对象析构时会对同一块空间进行二次释放造成程序崩溃。
拷贝构造函数的第二种写法:


这也会导致在传参时,实参失去对原有资源的掌握权,在后续操作时出现问题。

2.unique_ptr

代码如下(示例):

#include<iostream>
using namespace std;//辅助删除器
template <typename _Ty>
class Mydeletor
{public:Mydeletor() = default;void operator()(_Ty* op)const{if (op == NULL)  return;delete op;op = NULL;}
};template <typename _Ty>//delete Array
class Mydeletor<_Ty[]>
{public:Mydeletor() = default;void operator()(_Ty* op)const{if (op == NULL)  return;delete []op;op = NULL;}
};//unique_ptr
template<typename _Ty,typename _Dx=Mydeletor<_Ty>>
class my_unique_ptr
{public:using pointer = _Ty*;using element_type = _Ty;using delete_type = _Dx;
public:my_unique_ptr(_Ty* p = NULL) :_Ptr(p) {cout << "Create my_unique_ptr" << this << endl;}my_unique_ptr(const my_unique_ptr&) = delete;my_unique_ptr& operator=(const my_unique_ptr&) = delete;my_unique_ptr(const my_unique_ptr&& op)//移动构造{cout << "移动构造" << endl;_Ptr = op._Ptr;op._Ptr = NULL;  //_mydeletor = op._mydeletor;}template<typename _Uy>my_unique_ptr& operator=(_Uy* _p){if (_Ptr == (_Ty*)_p)  return *this;if (_Ptr != NULL){_mydeletor(_Ptr);}_Ptr = _p;cout << "1" << endl;return *this;}my_unique_ptr& operator=( my_unique_ptr&& op)//移动赋值{if (this == &op)  return *this;reset(op.release());//1 op.release交出_Ptr的拥有权//2 reset(op.release)是将this->_Ptr指向利用1中 返回的的对象 重建的对象//如果没有上边这一行代码,需要以下代码/*if (_Ptr != NULL){_mydeletor(_Ptr);}_Ptr = op._Ptr;op._Ptr = NULL;*/cout << "移动赋值" << endl;return *this;}~my_unique_ptr(){if (_Ptr != NULL){_mydeletor(_Ptr);_Ptr = NULL;}cout << "~my_unique_ptr" << this << endl;}_Dx& get_deleter(){return _mydeletor;}const _Dx& get_deleter()const{return _mydeletor;}operator bool(){return _Ptr != NULL;}_Ty&operator*(){return *(_Ptr);}_Ty* operator->(){return &**this;}void reset(_Ty* op = NULL){if (_Ptr!=NULL){_mydeletor(_Ptr);}_Ptr = op;}pointer release(){_Ty* old = _Ptr;_Ptr = NULL;return old;}void swap(my_unique_ptr op){std::swap(_Ptr, op._Ptr);std::swap(_mydeletor, op._mydeletor);}
private:_Ty* _Ptr;_Dx _mydeletor;
};

总结

unique_ptr删除了拷贝构造和赋值运算,加入了移动构造和移动赋值,解决了资源归属的问题,同时拥有自己的默认删除器,可以通过其来判断是调用删除一个对象的析构函数还是调用删除一组对象的析构函数。

C++ | auto_ptr与unique_ptr相关推荐

  1. C++——auto_ptr与unique_ptr

    auto_ptr与unique_ptr的比较 先介绍unique_ptr(独占智能指针)参考爱编程的大丙 std::unique_ptr 是一个独占型的智能指针,它不允许其他的智能指针共享其内部的指针 ...

  2. C++ 智能指针 :内存泄漏、 RAII、智能指针、auto_ptr、unique_ptr、shared_ptr、weak_ptr、定制删除器deleter

    文章目录 内存泄漏 什么是内存泄漏 内存泄漏的危害: 如何避免内存泄漏 RAII 智能指针 auto_ptr unique_ptr shared_ptr 循环引用问题 weak_ptr 定制删除器 内 ...

  3. C++智能指针详解(auto_ptr、unique_ptr、shared_ptr)

    文章目录 1. 智能指针的应用场景 2. 智能指针的介绍 3. 智能指针的使用与原理 3.1 auto_ptr 3.2 unique_ptr 3.3 shared_ptr 3.4 shared_ptr ...

  4. C++的智能指针auto_ptr、unique_ptr源码解析

    C++的智能指针auto_ptr.unique_ptr源码解析 1.前言 2.源码准备 3.源码解析 3.1.auto_ptr解析 3.2.unique_ptr解 3.3.unique_ptr的一个偏 ...

  5. c++系列 —— 智能指针auto_ptr和unique_ptr

    往期地址: c++系列一 -- c++的封装 c++系列二 -- c++的继承 c++系列三 -- 继承和多态特性 c++系列四 -- 运算符重载 c++系列五 -- 静态成员和静态类 c++系列六 ...

  6. C++——智能指针——auto_ptr、shared_ptr、unique_ptr

    1.4.智能指针 智能指针是行为类似于指针的类对象. C++11 中提供了三种智能指针,使用这些智能指针时需要引用头文件 : ·shared_ptr; ·unique_ptr; ·auto_ptr; ...

  7. 学习笔记 | c++中的smart pointer四个智能指针 shared_ptr、unique_ptr、weak_ptr、auto_ptr

    c++中的smart pointer四个智能指针 C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr其中后三个是c++11支持,并且第一个 ...

  8. 32. 对c++中的smart pointer四个智能指针shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解

    C++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被11弃用. 智能指针的作用是管理一个指针, ...

  9. C++ -- 智能指针 auto_ptr,unique_ptr,shared_ptr的简单实现和原理

    一,为什么需要智能指针 智能指针是一种预防型的内存泄漏的解决方案.由于C++没有垃圾回收器机制,所以每次new出来的资源都需要手动的delete,如果没有手动释放,就会造成资源泄漏等问题.因此,为了避 ...

最新文章

  1. 淘宝2011.9.21校园招聘会笔试题+答案
  2. 2016-09-09
  3. Linux运维13款实用工具
  4. 每日一题题目6:二分查找
  5. android自定义画板,android 自定义控件 -- 画板
  6. 【前端】这可能是你看过最全的css居中解决方案了~
  7. Bailian2694 逆波兰表达式(POJ NOI0202-1696, POJ NOI0303-1696)【文本】
  8. 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输
  9. 除了迅雷外,还有什么靠谱的BT下载软件?
  10. jQuery源码学习(四)
  11. 排队论模型(一):基本概念、输入过程与服务时间的常用概率分布
  12. 【翻译自mos文章】执行utlpwdmg.sql之后报ORA-28003, ORA-20001, ORA-20002, ORA-20003, ORA-20004 错误...
  13. html5 canvas实现桌面效果,基于html5 canvas实现漫天飞雪效果实例
  14. 免费wiki系统php,HDWiki
  15. 同建金融IT新生态——令克软件富途证券达成战略合作
  16. python写界面文字游戏_Python:pygame游戏编程之旅五(游戏界面文字处理详解)
  17. 自考计算机可以考研的学校,自考成功后想考研,这五个问题你了解清楚了吗?...
  18. 神经网络分为哪几类技术,神经网络分为哪几类型
  19. 免登陆免会员修改finalshell背景图(避坑版)
  20. [官方教程] [ES4封装教程]2.使用 Easy Sysprep v4 封装 Windows XP

热门文章

  1. HTML5 活动宣传页「My Flyme 独家记忆」开发实践总结
  2. 微信小程序开发-app开发公司-软件开发
  3. 【BZOJ4281】[ONTAK2015]Związek Harcerstwa Bajtockiego LCA
  4. Android中获取屏幕物理尺寸的方法
  5. iOS直播研发初了解
  6. [UE4GamePlay架构(九)GameInstance(转)
  7. 最近公共祖先 (LCA倍增)
  8. wordpress代码_如何在WordPress网站上轻松显示代码
  9. java antd实现登录_Spring WebFlux + React搭建后台管理系统(3): antd pro v5实现登入登出...
  10. 不知名大牛二十六个月Android学习工作总结(整理)