深入理解C++智能指针std::unique_ptr<一> 访问对象,获取裸指针,释放所有权,重置 📅 2026/8/26 16:02:52 访问对象使用 * 或 -获取裸指针使用 .get()注意不要用返回的指针去 delete。释放所有权使用 .release()它会返回裸指针并将 unique_ptr 置空但不释放内存需要你手动管理返回的指针重置使用 .reset()它会删除当前管理的对象并可选择接管新对象。#include iostream #include memory // 引入 unique_ptr // 一个简单的测试类 class Test { public: int value; Test(int v) : value(v) { std::cout Test 对象构造, value value std::endl; } ~Test() { std::cout Test 对象析构, value value std::endl; } void print() const { std::cout print() 被调用, value value std::endl; } }; int main() { std::cout 程序开始 std::endl; // // 1. 创建 unique_ptr // std::cout \n【1. 创建 unique_ptr】 std::endl; auto ptr std::make_uniqueTest(100); // // 2. 访问对象使用 - 和 * // std::cout \n【2. 访问对象】 std::endl; // 使用 - 调用成员函数 ptr-print(); // 使用 - 访问成员变量 std::cout 通过 - 访问 value: ptr-value std::endl; // 使用 * 解引用获取对象本身 (*ptr).value 200; std::cout 通过 * 修改 value 后: (*ptr).value std::endl; // // 3. 获取裸指针使用 .get() // std::cout \n【3. 获取裸指针】 std::endl; Test* raw_ptr ptr.get(); std::cout 裸指针指向的 value: raw_ptr-value std::endl; std::cout 注意不要 delete raw_ptrptr 仍拥有所有权 std::endl; // // 4. 释放所有权使用 .release() // std::cout \n【4. 释放所有权 (.release())】 std::endl; std::cout 释放前ptr (ptr ? 非空 : 为空) std::endl; Test* released_ptr ptr.release(); // ptr 放弃所有权返回裸指针 std::cout 释放后ptr (ptr ? 非空 : 为空) std::endl; std::cout 被释放的裸指针指向的 value: released_ptr-value std::endl; std::cout ⚠️ 注意现在需要手动 delete released_ptr std::endl; delete released_ptr; // 必须手动释放 std::cout ✅ 已手动 delete std::endl; // // 5. 重置使用 .reset() // std::cout \n【5. 重置 (.reset())】 std::endl; // 5.1 reset() 不带参数删除当前对象置为空 auto ptr2 std::make_uniqueTest(300); std::cout ptr2 reset 前 (ptr2 ? 非空 : 为空) std::endl; ptr2.reset(); // 删除对象ptr2 变为空 std::cout ptr2 reset() 后 (ptr2 ? 非空 : 为空) std::endl; // 5.2 reset() 带参数删除旧对象接管新对象 std::cout \n--- reset(new对象) 演示 --- std::endl; auto ptr3 std::make_uniqueTest(400); std::cout ptr3 当前 value ptr3-value std::endl; ptr3.reset(new Test(500)); // 先析构旧的(400)再构造新的(500) std::cout ptr3 reset 后 value ptr3-value std::endl; // // 6. 使用 std::move 转移所有权补充 // std::cout \n【6. 补充移动语义转移所有权】 std::endl; auto ptr4 std::make_uniqueTest(600); std::cout ptr4 创建成功ptr4 (ptr4 ? 非空 : 为空) std::endl; auto ptr5 std::move(ptr4); // 所有权转移ptr4 变为空 std::cout move 后ptr4 (ptr4 ? 非空 : 为空) std::endl; std::cout move 后ptr5 (ptr5 ? 非空 : 为空) value ptr5-value std::endl; // ptr5 在作用域结束时会自动释放 std::cout \n main 结束所有资源已清理 std::endl; return 0; }