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

移动语义让C++中的资源管理更高效,尤其在智能指针中体现明显。通过std::move,可以将一个智能指针的所有权转移给另一个,避免不必要的拷贝和资源浪费。下面用std::unique_ptr和std::shared_ptr来说明移动语义的影响和使用方式。
std::unique_ptr与所有权转移
std::unique_ptr是独占式智能指针,同一时间只能有一个unique_ptr拥有对象。它不支持拷贝,但支持移动。使用std::move可以将所有权从一个unique_ptr转移到另一个。
示例:
#include #include struct MyClass { int value; MyClass(int v) : value(v) { std::cout << "构造: " << value << "n"; } ~MyClass() { std::cout << "析构: " << value << "n"; }};int main() { std::unique_ptr ptr1 = std::make_unique(42); std::cout << "ptr1 value: " <value << "n"; // 使用std::move转移所有权 std::unique_ptr ptr2 = std::move(ptr1); // 此时ptr1为空,ptr2持有对象 if (ptr1 == nullptr) { std::cout << "ptr1 已为空n"; } std::cout << "ptr2 value: " <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 #include int main() { std::shared_ptr sp1 = std::make_shared(100); std::cout << "sp1 use_count: " << sp1.use_count() << "n"; // 移动sp1到sp2 std::shared_ptr 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 ptr) { std::cout << "处理对象: " <value << "n";} // ptr在此处析构int main() { auto p = std::make_unique(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是触发移动的关键,用起来简单但效果显著。
以上就是移动语义对智能指针影响 std move转移所有权示例的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1472697.html
微信扫一扫
支付宝扫一扫