unique_ptr与移动构造函数结合实现了安全高效的资源所有权转移,通过禁用拷贝、启用移动语义,杜绝了内存泄漏和双重释放风险,广泛应用于工厂函数、容器存储、PIMPL模式等场景。

unique_ptr
unique_ptr
unique_ptr
unique_ptr
当一个
unique_ptr
unique_ptr
unique_ptr
unique_ptr
举个例子,假设我们有一个工厂函数创建了一个对象:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
#include <memory>
#include <vector>
#include <string>
class MyObject {
public:
std::string name;
MyObject(std::string n) : name(std::move(n)) {
std::cout << "MyObject " << name << " created." << std::endl;
}
~MyObject() {
std::cout << "MyObject " << name << " destroyed." << std::endl;
}
void doSomething() const {
std::cout << "MyObject " << name << " is doing something." << std::endl;
}
};
// 工厂函数,返回一个unique_ptr
std::unique_ptr<MyObject> createObject(std::string name) {
// 这里隐式地使用了移动语义,将make_unique创建的unique_ptr移动出函数
return std::make_unique<MyObject>(std::move(name));
}
int main() {
std::cout << "--- Start main ---" << std::endl;
// 从工厂函数接收所有权
std::unique_ptr<MyObject> obj1 = createObject("Alpha");
obj1->doSomething();
// 将obj1的所有权移动到obj2
std::unique_ptr<MyObject> obj2 = std::move(obj1);
if (obj1) { // obj1现在是空的
std::cout << "obj1 still holds a pointer." << std::endl;
} else {
std::cout << "obj1 no longer holds a pointer." << std::endl;
}
obj2->doSomething();
// 存储到容器中
std::vector<std::unique_ptr<MyObject>> objects;
objects.push_back(createObject("Beta")); // 隐式移动
objects.push_back(std::move(obj2)); // 显式移动
objects[0]->doSomething();
objects[1]->doSomething();
std::cout << "--- End main ---" << std::endl;
// obj1, obj2在作用域结束时,如果非空,会自动调用析构函数
// objects容器中的unique_ptr在容器销毁时,会自动调用析构函数
return 0;
}这段代码清晰地展示了
unique_ptr
createObject
unique_ptr
obj1
obj2
unique_ptr
std::vector
unique_ptr
这是
unique_ptr
shared_ptr
unique_ptr
unique_ptr
unique_ptr
unique_ptr
unique_ptr
为了从根本上避免这种风险,
unique_ptr
delete
unique_ptr
unique_ptr
unique_ptr
std::unique_ptr<T>
std::unique_ptr<MyObject> createObject(std::string name)
unique_ptr
std::vector<std::unique_ptr<BaseClass>>
unique_ptr
unique_ptr
std::unique_ptr<Impl>
Impl
unique_ptr
unique_ptr
unique_ptr
FILE*
fclose
std::unique_ptr<T>
这些场景都得益于
unique_ptr
unique_ptr
尽管
unique_ptr
常见的陷阱:
std::move
unique_ptr
unique_ptr
std::move
unique_ptr
std::move
std::move
std::move
unique_ptr
std::move
unique_ptr
unique_ptr
std::move
unique_ptr
get()
unique_ptr::get()
get()
unique_ptr
get()
unique_ptr
shared_ptr
unique_ptr
shared_ptr
unique_ptr
最佳实践:
std::make_unique
unique_ptr
std::make_unique
unique_ptr
unique_ptr
unique_ptr
std::move
std::unique_ptr<T>
std::move(my_unique_ptr)
T*
T&
const T*
const T&
my_unique_ptr.get()
*my_unique_ptr
unique_ptr
unique_ptr
unique_ptr
unique_ptr
unique_ptr
unique_ptr
以上就是C++unique_ptr与移动构造函数结合使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号