深入理解C++ 智能指针std::shared_ptr<三>reset()方法

发布时间:2026/8/24 22:11:01
深入理解C++ 智能指针std::shared_ptr<三>reset()方法 std::shared_ptr的reset()方法是改变其所有权状态的核心操作。它的主要作用是释放当前管理的对象如果有并可选地接管一个新对象。原型常用重载形式void reset() noexcept; // (1)template class Y void reset( Y* ptr ); // (2)template class Y, class Deleter void reset( Y* ptr, Deleter d ); // (3)请看下面代码示例#include iostream #include memory // 一个简单的类用于观察构造和析构 struct Foo { int val; Foo(int v) : val(v) { std::cout 构造 Foo( val )\n; } ~Foo() { std::cout 析构 Foo( val )\n; } }; int main() { std::shared_ptrFoo sp; // ---------- (1) void reset() noexcept ---------- // 当前 sp 为空调用 reset() 什么也不做 sp.reset(); std::cout 1. sp.reset() 后sp 为 (sp ? 非空 : 空) \n\n; // ---------- (2) reset( Y* ptr ) ---------- sp.reset(new Foo(1)); // 接管新对象 Foo(1) std::cout 2. sp.reset(new Foo(1)) 后sp 管理 Foo(1)\n\n; // 再次调用 reset() 释放当前对象Foo(1)并置空 sp.reset(); // 释放 Foo(1) std::cout 3. 再次 sp.reset() 释放了 Foo(1)sp 变为空\n\n; // 重新接管另一个对象 Foo(2) sp.reset(new Foo(2)); std::cout 4. sp.reset(new Foo(2)) 后sp 管理 Foo(2)\n\n; // ---------- (3) reset( Y* ptr, Deleter d ) ---------- // 自定义删除器先打印信息再 delete auto customDeleter [](Foo* p) { std::cout 自定义删除器删除 Foo( p-val )\n; delete p; }; // reset 会先释放当前管理的 Foo(2)默认删除然后接管 Foo(3) 并使用自定义删除器 sp.reset(new Foo(3), customDeleter); std::cout 5. sp.reset(new Foo(3), customDeleter) 后sp 管理 Foo(3)自定义删除器\n\n; // 程序结束sp 析构时会调用自定义删除器删除 Foo(3) std::cout --- 主函数结束sp 即将销毁 ---\n; return 0; }

相关新闻