unique_ptr的移动语义实现资源安全转移,禁止拷贝避免双重释放,通过移动构造和赋值将所有权从源指针转移至目标,源变为空,确保独占性。

unique_ptr
unique_ptr
unique_ptr
unique_ptr
当我第一次接触
unique_ptr
想象一下,你有一个
unique_ptr<MyObject> ptr1(new MyObject());
MyObject
unique_ptr
ptr2
unique_ptr
MyObject
delete
unique_ptr
但有时候,我们确实需要“传递”这个资源。比如,一个函数创建了一个对象,然后想把它返回给调用者;或者在一个容器里,我们想把一个
unique_ptr
立即学习“C++免费学习笔记(深入)”;
unique_ptr
std::move
unique_ptr
unique_ptr
MyObject
unique_ptr
MyObject
unique_ptr
nullptr
这意味着,一旦移动完成,你不能再通过源
unique_ptr
MyObject
#include <iostream>
#include <memory>
#include <vector>
#include <string>
class MyResource {
public:
int id_;
MyResource(int id) : id_(id) {
std::cout << "MyResource " << id_ << " constructed." << std::endl;
}
~MyResource() {
std::cout << "MyResource " << id_ << " destructed." << std::endl;
}
void doSomething() {
std::cout << "MyResource " << id_ << " doing something." << std::endl;
}
};
std::unique_ptr<MyResource> createResource(int id) {
// 函数内部创建unique_ptr,并返回
// 这里会隐式地发生移动
return std::make_unique<MyResource>(id);
}
int main() {
std::cout << "--- Initial unique_ptr ---" << std::endl;
std::unique_ptr<MyResource> ptr1 = std::make_unique<MyResource>(101);
if (ptr1) {
ptr1->doSomething();
}
std::cout << "\n--- Moving ownership ---" << std::endl;
std::unique_ptr<MyResource> ptr2 = std::move(ptr1); // 显式移动
if (ptr1) { // ptr1 现在是空的
std::cout << "ptr1 still holds resource!" << std::endl;
} else {
std::cout << "ptr1 is now null." << std::endl;
}
if (ptr2) {
ptr2->doSomething(); // ptr2 现在拥有资源
}
std::cout << "\n--- Moving from function return ---" << std::endl;
std::unique_ptr<MyResource> ptr3 = createResource(202); // 隐式移动
if (ptr3) {
ptr3->doSomething();
}
std::cout << "\n--- Moving into a vector ---" << std::endl;
std::vector<std::unique_ptr<MyResource>> resources;
resources.push_back(std::move(ptr2)); // 将ptr2持有的资源移动到vector中
// ptr2 再次变为空
if (ptr2) {
std::cout << "ptr2 still holds resource after push_back!" << std::endl;
} else {
std::cout << "ptr2 is now null after push_back." << std::endl;
}
resources.push_back(std::move(ptr3)); // 将ptr3持有的资源移动到vector中
// ptr3 再次变为空
if (ptr3) {
std::cout << "ptr3 still holds resource after push_back!" << std::endl;
} else {
std::cout << "ptr3 is now null after push_back." << std::endl;
}
std::cout << "\n--- Accessing resources in vector ---" << std以上就是C++unique_ptr移动语义与转移所有权的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号