C++智能指针简单剖析

Calandra ·
更新时间:2024-11-10
· 622 次阅读

  先引入一个知识点即:   RAII(Resource Acquisition Is Initialization)   资源分配即初始化,定义一个类来封装资源的分配和释放,在构造函数完成资源的分配和初始化,在析构函数完成资源的清理,可以保证资源的正确初始化和释放。   智能指针的出现是为了更好地完成清理工作,大程度的避免内存泄露等问题,正是资源分配实现的一种方法。智能指针是自动管理指针所指向的资源的释放。   我们虽然可以人为地释放的自己所开辟的内容,但是在有些情况下,导致自己所开辟的内存不能得到释放,从而导致内存泄漏。下面我简单模拟一种常见的情况:

  既然需要智能指针那么我们应该了解一下智能指针的种类   C++11标准库中有以下几种指针:   auto_ptr:是C++中早的智能指针,但存在很大问题。它所实现的功能为指针管理权的转移。(不要使用)   虽然不使用,但是我们也需要去了解!下面是我的代码简单逻辑实现: template<class T> class Auto_ptr { public: Auto_ptr(T& ptr) :_ptr(ptr) {} ~Auto_ptr() { delete _ptr; } Auto_ptr(Auto_ptr<T>& ap) :_ptr(ap._ptr) { ap._ptr = NULL; } Auto_ptr& operator=(Auto_ptr<T>& ap) { if (this != &ap) { delete _ptr; _ptr = ap._ptr; ap._ptr = NULL; } } private: T* _ptr; };   unique_ptr:也称为防拷贝智能指针,它通过将赋值运算符的重载函数、拷贝构造函数声明设置为私有函数,既防止类外的人为定义,同时阻止了拷贝。(可以基本满足需求)   下面是我代码的简单逻辑的实现: template<class T> class Unique_ptr { public: Unique_ptr(T& ptr) :_ptr(ptr) {} ~Unique_ptr() { delete _ptr; } private: T* _ptr; Unique_ptr(Unique_ptr<T>& ap); Unique_ptr& operator=(Unique_ptr<T>& ap); };   shared_ptr:使用引用计数实现的智能指针,功能强大,使用以及适用场景多,但是存在复杂,与循环使用的问题。(在下篇博客重点介绍循环使用的问题)   weakd_ptr:为了解决shared_ptr指针的循环使用缺陷。   关于shared_ptr指针与weakd_ptr:将在下一篇博客重点讲述。



智能指针 c+ C++ 指针

需要 登录 后方可回复, 如果你还没有账号请 注册新账号