访问对象:使用 * 或 ->
获取裸指针:使用 .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_unique<Test>(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_ptr,ptr 仍拥有所有权" << 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_unique<Test>(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_unique<Test>(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_unique<Test>(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; }