简介
smart pointers是一种C++对象,它提供operator->和 unary operator*,藉以模拟一般指针的行为。
template<typename T>
class SmartPtr
{
public:
explicit SmartPtr(T* pointee) : pointee_(pointee);
SmartPtr& operator=(const SmartPtr& other);
~SmartPtr();
T& operator*() const
{
return *pointee_;
}
T* operator->() const
{
return pointee_;
}
private:
T* pointee_;
};
使用方式:
class Widget
{
public :
void fun();
};
SmartPtr<Widget> sp(new Widget);
sp->fun();
(*sp).fun();
背后机制——RAII
RAII是Resource Acquisition Is Initialization的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时获取对应的资源,在对象生命期内控制对资源的访问,使之始终保持有效,最后在对象析构的时候,释放构造时获取的资源。
值语义
smart pointers具有“value语义”。
对象具有“value语义”,可以“拷贝”,可以“赋值"。
拥有权管理方式:
- 自动转移拥有权
- 引用计数
分层技术
smart pointer 的 operator->不一定传回指针,它可以传回一个“实作出operator->”的对象,而且不改变语法。
管理操作系统的内部资源。
智能指针可能存在的三种类型:
引用计数
侵入式引用计数
引用计数最有效率的解法是通过pointee对象本身来保存计数器。
非侵入式引用计数
实现一:
实现二:
实现三:引用链接——双向链表结构
缺点:存在环路管理问题