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::unique_ptr<int> p1 = std::make_unique<int>(42); std::unique_ptr<int> p2 = std::move(p1); // p1 现在为空
std::move
基本上就这些。掌握删除拷贝、实现移动构造与赋值、配合
std::move
unique_ptr
以上就是C++unique_ptr实现移动语义技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号