移动语义通过std::move实现智能指针所有权转移,避免拷贝开销;unique_ptr因独占所有权仅支持移动,shared_ptr移动时无需增加引用计数更高效,函数传参时使用std::move可将资源所有权安全移交,提升性能。

移动语义让C++中的资源管理更高效,尤其在智能指针中体现明显。通过std::move,可以将一个智能指针的所有权转移给另一个,避免不必要的拷贝和资源浪费。下面用std::unique_ptr和std::shared_ptr来说明移动语义的影响和使用方式。
std::unique_ptr是独占式智能指针,同一时间只能有一个unique_ptr拥有对象。它不支持拷贝,但支持移动。使用std::move可以将所有权从一个unique_ptr转移到另一个。
示例:
#include <iostream>
#include <memory>
struct MyClass {
int value;
MyClass(int v) : value(v) { std::cout << "构造: " << value << "\n"; }
~MyClass() { std::cout << "析构: " << value << "\n"; }
};
int main() {
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(42);
std::cout << "ptr1 value: " << ptr1->value << "\n";
// 使用std::move转移所有权
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// 此时ptr1为空,ptr2持有对象
if (ptr1 == nullptr) {
std::cout << "ptr1 已为空\n";
}
std::cout << "ptr2 value: " << ptr2->value << "\n";
return 0;
}
输出:
构造: 42说明:ptr1在std::move后不再持有对象,析构时不会释放资源,由ptr2负责释放。
虽然shared_ptr允许多个指针共享所有权,但它也支持移动语义。移动一个shared_ptr比拷贝更高效,因为不需要原子操作递增引用计数。
示例:
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> sp1 = std::make_shared<int>(100);
std::cout << "sp1 use_count: " << sp1.use_count() << "\n";
// 移动sp1到sp2
std::shared_ptr<int> sp2 = std::move(sp1);
std::cout << "移动后 sp1 use_count: " << (sp1 ? "非空" : "空") << "\n";
std::cout << "sp2 use_count: " << sp2.use_count() << ", value: " << *sp2 << "\n";
return 0;
}
输出:
sp1 use_count: 1说明:移动后sp1为空,引用计数不变,sp2接管资源。
移动语义常用于函数间传递智能指针,避免拷贝开销。
示例:
void process_ptr(std::unique_ptr<MyClass> ptr) {
std::cout << "处理对象: " << ptr->value << "\n";
} // ptr在此处析构
int main() {
auto p = std::make_unique<MyClass>(99);
process_ptr(std::move(p)); // 所有权转移给函数
if (!p) {
std::cout << "p 已移交\n";
}
return 0;
}
输出:
构造: 99说明:main中的p通过std::move将所有权交给函数参数,函数结束时自动清理。
基本上就这些。移动语义配合智能指针,让资源管理既安全又高效。unique_ptr靠移动实现所有权转移,shared_ptr移动能减少计数操作开销。std::move是触发移动的关键,用起来简单但效果显著。
以上就是移动语义对智能指针影响 std move转移所有权示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号