std::unique_ptr通过删除拷贝构造和赋值函数防止资源拷贝,确保独占所有权;2. 实现移动构造和赋值函数以转移资源,原对象指针置空避免重复释放;3. 使用std::move将左值转为右值引用触发移动操作,完成资源安全转移。

在C++中,
std::unique_ptr是一个独占式智能指针,它通过移动语义实现资源的转移,而不是拷贝。这背后的关键在于删除拷贝构造和拷贝赋值函数,并提供移动构造和移动赋值函数。掌握这些技巧有助于理解如何手动实现类似行为。
禁用拷贝操作
unique_ptr不允许拷贝,因为所有权必须唯一。这是通过显式删除拷贝构造函数和拷贝赋值操作符实现的:
unique_ptr(const unique_ptr&) = delete; unique_ptr& operator=(const unique_ptr&) = delete;
这样任何试图拷贝的行为都会在编译时报错,强制使用移动语义。
实现移动构造函数
移动构造函数接收一个右值引用,将资源从源对象“窃取”到新对象:
立即学习“C++免费学习笔记(深入)”;
unique_ptr(unique_ptr&& other) noexcept {
ptr_ = other.ptr_; // 转移指针
other.ptr_ = nullptr; // 原对象置空,防止重复释放
}
关键点是把原指针置为
nullptr,确保析构时不会重复释放内存。
实现移动赋值操作符
移动赋值先清理当前资源,再执行与移动构造类似的操作:
unique_ptr& operator=(unique_ptr&& other) noexcept {
if (this != &other) { // 防止自赋值
delete ptr_; // 释放当前资源
ptr_ = other.ptr_; // 接管新资源
other.ptr_ = nullptr; // 源对象置空
}
return *this;
}
注意释放旧资源是必要的,避免内存泄漏。
利用 std::move 显式触发移动
即使定义了移动操作,编译器也不会自动对具名变量调用移动。需要使用
std::move将左值转为右值引用:
std::unique_ptrp1 = std::make_unique (42); std::unique_ptr p2 = std::move(p1); // p1 现在为空
std::move不做实际移动,只是类型转换,真正的资源转移发生在移动构造或赋值中。
基本上就这些。掌握删除拷贝、实现移动构造与赋值、配合
std::move使用,就能模拟
unique_ptr的核心行为。不复杂但容易忽略细节,比如置空原指针和释放旧资源。










