花开月下机器人 三类核心智能指针40秒上手
核心原理10秒速懂
智能指针的本质是基于RAII机制的栈对象,把堆内存的生命周期完全绑定到栈对象的自动销毁流程上,不用手动写delete,哪怕程序中途抛异常也不会出现内存泄漏。所有智能指针都定义在<memory>头文件里,完全不用后台垃圾回收,靠C++原生的作用域规则管理内存,性能几乎和裸指针持平。
三类核心智能指针40秒上手
unique_ptr 独占智能指针它是零额外开销的独占式指针,大小和普通裸指针完全一致,同一时间只能有一个unique_ptr指向目标对象,禁止直接拷贝,只能用
std::move转移所有权。出了作用域自动释放内存,最适合管理局部独占资源,比如嵌入式场景下的外设句柄、临时大数组。
std::unique_ptr<LargeObject> pObj(new LargeObject());
pObj->doWork(); // 直接用->访问对象,和裸指针用法一致
// 函数结束自动释放,完全不用手动delete
shared_ptr 共享智能指针通过引用计数实现多对象共享同一块内存,每多一个shared_ptr拷贝指向对象,引用计数就+1,指针销毁时计数-1,计数归0就自动释放内存。它的大小是裸指针的两倍,一块存对象地址,一块存控制块的引用计数,适合多个模块共同管理的资源场景。
std::shared_ptr<MyData> p1 = std::make_shared<MyData>();
std::shared_ptr<MyData> p2 = p1; // 引用计数变为2
std::cout << p1.use_count() << std::endl; // 输出2
weak_ptr 弱引用指针专门用来解决shared_ptr的循环引用问题,它指向shared_ptr管理的对象但完全不增加引用计数,相当于一个“安全观察者”,不会影响对象的生命周期。需要访问对象时调用
lock()就能拿到一个有效的shared_ptr,避免出现悬空指针。
最后10秒避坑提醒
永远不要在函数参数列表里直接new智能指针,要单独一行创建智能指针,避免极端场景下的隐式内存泄漏;C++98的auto_ptr已经完全被unique_ptr替代,新项目不要使用;shared_ptr的循环引用一定要用weak_ptr打破,不然内存永远不会被释放。 </doc_start> 一分钟就能掌握核心用法,日常开发里优先用unique_ptr,需要共享资源再用shared_ptr,遇到循环引用搭配weak_ptr,几乎可以彻底告别手动管理内存的各类隐患。