前言
在 C++ 开发里,动态内存管理一直是让开发者头疼的问题。手动 new 分配、delete 释放的模式,不仅要求时刻关注内存生命周期,还容易埋下隐患:忘记调用 delete 导致内存泄漏、重复释放引发崩溃,或者异常抛出时跳过清理代码。这些'隐形 bug'轻则拖慢性能,重则直接搞挂程序。
为了解决这个痛点,C++ 标准库引入了智能指针。它基于 RAII(资源获取即初始化)思想,把动态内存封装进对象里,利用析构函数自动回收资源,从根本上减少手动管理的负担。
本文将梳理智能指针的核心原理,详解 unique_ptr、shared_ptr、weak_ptr 等标准库工具的实现逻辑与使用场景,顺便聊聊循环引用和删除定制器这些进阶话题。
智能指针的作用
简单来说,用对了智能指针,就不用自己手动写 delete 了。
手动管理内存的坑在于:抛异常时可能跳过 delete,或者单纯忘记释放。智能指针通过对象生命周期绑定资源,对象销毁时自动释放,安全得多。
核心原理
智能指针的本质是 RAII:资源交给对象管理,对象活着资源就有效,对象挂了资源就释放。实现上要让它的用法像普通指针一样自然。
下面是一个最基础的模拟实现,展示了核心思路:
template <class T>
class SmartPtr {
public:
SmartPtr(T* ptr) : _ptr(ptr) {}
~SmartPtr() { delete _ptr; }
T& operator*() { return *_ptr; }
T* operator->() { return _ptr; }
private:
T* _ptr;
};
使用时和普通指针没区别:
SmartPtr<string> sp(new string("hello"));
但上面这个版本有个致命问题:它是可拷贝的。如果两个对象指向同一块内存,析构时会重复释放。所以我们需要更严格的控制。
标准库中的智能指针
std::auto_ptr(已废弃)
这是 C++98 时代的产物,原理是所有权转移。拷贝时,源对象会把管理权转给目标对象,自己变空。这导致很多潜在风险,比如拷贝后原指针失效,且无法恢复。现在公司规范基本都禁止使用了,C++11 也将其移除。
模拟实现要点:
template <class T>
class auto_ptr {
public:
(T* ptr) : _ptr(ptr) {}
~() { _ptr; }
(auto_ptr<T>& ap) : _ptr(ap._ptr) {
ap._ptr = ;
}
:
T* _ptr;
};


