1.5、智能指针的本质是什么,它们的实现原理是什么?
智能指针的本质
智能指针本质上是一个类模板,它封装了一个普通的裸指针,并通过对象的生命周期管理该指针所指向的资源(通常是动态分配的内存)。智能指针利用C++的RAII(Resource Acquisition Is Initialization)思想,即在构造函数中获取资源,在析构函数中释放资源,从而实现自动管理资源,避免手动调用delete导致的内存泄漏和悬挂指针问题。
简而言之,智能指针就是“带有自动释放功能的指针类”,它像普通指针一样使用,但在超出作用域时会自动释放资源。
智能指针的实现原理
智能指针的实现依赖以下几个核心机制:
- 1. 封装裸指针:智能指针内部保存一个普通指针,指向动态分配的对象。
- 2. 构造与析构:构造函数接收裸指针,析构函数负责释放资源(调用delete)。
- 3. 重载操作符:重载*和->操作符,使智能指针表现得像普通指针,可以直接访问指针指向的对象成员。
- 4. 资源管理策略:
- • unique_ptr:独占所有权,不允许复制,只能移动,确保资源唯一拥有者。
- • shared_ptr:基于引用计数实现,多个shared_ptr实例共享同一资源,引用计数为0时释放资源。
- • weak_ptr:弱引用,不增加引用计数,用于解决shared_ptr循环引用问题。
引用计数的实现示例(shared_ptr核心)
shared_ptr通过一个额外的引用计数变量来跟踪当前有多少shared_ptr实例指向同一资源:
- 1. 构造时引用计数初始化为1。
- 2. 拷贝构造或赋值时,引用计数加1。
- 3. 析构时,引用计数减1,当计数减为0时,释放资源和引用计数本身。
示意代码片段:
template <typename T>
class SmartPointer {
T* _ptr;
size_t* _refCount;
public:
SmartPointer(T* p = nullptr) : _ptr(p), _refCount(new size_t(1)) {}
SmartPointer(const SmartPointer& sp) : _ptr(sp._ptr), _refCount(sp._refCount) {
++(*_refCount);
}
SmartPointer& operator=(const SmartPointer& sp) {
if (this != &sp) {
release();
_ptr = sp._ptr;
_refCount = sp._refCount;
++(*_refCount);
}
return *this;
}
~SmartPointer() {
release();
}
T& operator*() { return *_ptr; }
T* operator->() { return _ptr; }
private:
void release() {
if (--(*_refCount) == 0) {
delete _ptr;
delete _refCount;
}
}
};
这段代码体现了智能指针通过引用计数管理资源的核心思想。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1173
文章版权归作者所有,未经允许请勿转载。
THE END