reset方法用于安全释放智能指针管理的对象并可选接管新对象:①调用时减少引用计数(shared_ptr)或直接释放(unique_ptr);②可传入新对象指针或置为nullptr;③shared_ptr在引用计数为0时释放资源,unique_ptr直接释放;④推荐使用make_shared/make_unique避免原始指针误用。

智能指针的 reset 方法是管理动态内存的重要工具,用于安全地释放当前管理的对象,并可选择性地接管新的对象。掌握 reset 的使用,有助于避免内存泄漏和悬空指针问题。
reset 基本作用
调用 reset 会做两件事:一是减少当前所管理对象的引用计数(对于 shared_ptr)或释放对象(对于 unique_ptr),二是将智能指针指向一个新的对象或置为空。
如果没有传入新对象,智能指针将变为 nullptr,不再管理任何资源。
示例:std::shared_ptr
ptr = std::make_shared (10); ptr.reset(); // 释放 int 对象,ptr 变为 nullptr
传递新对象进行重置
可以传入一个新创建的原始指针,让智能指针转而管理这个新对象。
立即学习“C++免费学习笔记(深入)”;
示例:ptr.reset(new int(20)); // 释放原对象,接管新 int(20)
- 等价写法:
ptr = std::make_shared
(推荐使用 make_shared)(20);
注意:传入原始指针时,确保该指针是 new 出来的且未被其他指针管理,否则可能导致重复释放。
与 nullptr 显式重置
显式调用 reset(nullptr) 语义清晰,明确表示放弃所有权。
ptr.reset(nullptr); // 效果同 ptr.reset()
在条件释放资源时很有用,比如根据配置决定是否保留对象。
unique_ptr 和 shared_ptr 的行为差异
两者 reset 行为略有不同:
- unique_ptr:直接释放所指对象(若存在),因为独占所有权。
- shared_ptr:引用计数减一,仅当计数为 0 时才真正释放对象。
reset 后,两种指针都变为不指向任何对象的状态。
基本上就这些。合理使用 reset 能让资源管理更灵活,但优先考虑 RAII 和 make_shared/make_unique 是更安全的做法。










