boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

移动语义对智能指针影响 std move转移所有权示例


avatar
作者 2025年8月24日 18

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

移动语义对智能指针影响 std move转移所有权示例

移动语义让C++中的资源管理更高效,尤其在智能指针中体现明显。通过std::move,可以将一个智能指针的所有权转移给另一个,避免不必要的拷贝和资源浪费。下面用std::unique_ptr和std::shared_ptr来说明移动语义的影响和使用方式。

std::unique_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 value: 42
ptr1 已为空
ptr2 value: 42
析构: 42

说明:ptr1在std::move后不再持有对象,析构时不会释放资源,由ptr2负责释放。

std::shared_ptr也支持移动语义

虽然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 use_count: 空
sp2 use_count: 1, value: 100

说明:移动后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
处理对象: 99
析构: 99
p 已移交

说明:main中的p通过std::move将所有权交给函数参数,函数结束时自动清理。

基本上就这些。移动语义配合智能指针,让资源管理既安全又高效。unique_ptr靠移动实现所有权转移,shared_ptr移动能减少计数操作开销。std::move是触发移动的关键,用起来简单但效果显著。



评论(已关闭)

评论已关闭