C++智能指针原理与实现
Posted 白龙码~
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++智能指针原理与实现相关的知识,希望对你有一定的参考价值。
文章目录
智能指针
智能指针基于RAII技术(Resource Acquisition Is Initialization,即资源获取即初始化,构造时分配资源,析构时释放资源)。
用指针构造智能指针对象,并在对象析构时自动释放指针指向的内存空间。
在智能指针对象中,重载了 * 和 -> 两个操作符,使其具有指针一样的行为。
1、auto_ptr
- 对于拷贝构造,auto_ptr会对拷贝对象的指针进行置空处理,这样就导致拷贝对象不能再被使用;
- 而对于赋值重载,auto_ptr会对被赋值对象的资源进行释放,复制对象的指针也被置空,最终只剩下被复制对象这一份指针。
template<class T>
class auto_ptr
public:
auto_ptr(T* ptr)
: _ptr(ptr)
auto_ptr(auto_ptr<T>& ap)
_ptr = ap._ptr;
ap._ptr = nullptr;
auto_ptr<T>& operator=(auto_ptr<T>& ap)
if (this != &ap)
delete _ptr;
_ptr = ap._ptr;
ap._ptr = nullptr;
return *this;
T& operator*()
return *_ptr;
T* operator->()
return _ptr;
~auto_ptr()
delete _ptr;
private:
T* _ptr;
;
2、unique_ptr
unique_ptr在auto_ptr的基础上直接禁用了拷贝构造和赋值重载(delete),从而避免了auto_ptr在使用上容易出错的问题,但是没有了这两个函数,对于用户非常不便。
3、shared_ptr
基于写时拷贝技术,通过计数器的加减判断是否需要释放指针指向的空间。
// shared_ptr模拟实现
template <class T>
class shared_ptr
public:
shared_ptr(T* ptr)
: _ptr(ptr)
, _pCount(new int(1))
shared_ptr(const shared_ptr& sp)
_ptr = sp._ptr;
_pCount = sp._pCount;
++* _pCount;
shared_ptr<T>& operator=(const shared_ptr<T>& sp)
if (_ptr != sp._ptr)
if (--(*_pCount) == 0)
delete _ptr;
delete _pCount;
_ptr = sp._ptr;
_pCount = sp._pCount;
++* _pCount;
return *this;
~shared_ptr()
if (--(*_pCount) == 0 && _ptr != nullptr)
delete _ptr;
delete _pCount;
private:
T* _ptr;
int* _pCount; // 计数器指针
;
shared_ptr的问题
- 计数器是线程安全的,但是利用指针读写依然需要互斥量的参与。
- shared_ptr在循环引用(比如双链表)时会出现资源泄露的问题。解决办法:
weak_ptr
- C++库中的智能指针默认使用
delete
进行指针指向空间的释放,但是如果指针是new []
或者malloc
出来的,那么使用delete就会出现问题。解决办法:在构造智能指针时可以提供删除器Deleter(仿函数),那么析构函数会自动调用该删除器进行资源回收。
注:weak_ptr拷贝shared_ptr时,不会导致share_ptr的计数器增加,从而解决循环引用的问题。
以上是关于C++智能指针原理与实现的主要内容,如果未能解决你的问题,请参考以下文章