C++智能指针面试题 c++智能指针和指针的区别
智能指针结合移动目标可高效转移头部。std::unique_ptr通过std::move转移独占空间,原指针置空;std::shared_ptr移动时减少引用计数,常用于函数传参和工厂函数返回,提升性能。

在C中,智能指针结合移动坐标可以地移动对象的副本,避免不必要的高效复制。常用的智能指针如std::unique_ptr登录后复制登录后复制和std::shared_ptr登录后复制登录后复制都支持移动操作,但副本转移的坐标有所不同。下面通过示例说明如何使用移动坐标实现眉毛的移动。std::unique_ptr 的复制转移
std::unique_ptr登录后复制登录后复制是独占式智能指针,同样只能有一个unique_ptr登录后复制登录后复制拥有对象。因此,拷贝和构造复制赋值被取消,但支持移动构造和移动分配。
当使用std::move()登录后复制时间复制时,原标题模板放弃,目标导师获得控制权。
#include lt;iostreamgt;#include lt;memorygt;struct Data { int value; Data(int v) : value(v) { std::cout lt;lt; quot;Data(quot; lt;lt; value lt;lt; quot;) 创建\nquot;; } ~Data() { std::cout lt;lt; quot;Data(quot; lt;lt; value lt;lt; quot;) destroy\nquot;; }};int main() { std::unique_ptrlt;Datagt; ptr1 = std::make_uniquelt;Datagt;(42); std::cout lt;lt; quot;ptr1 拥有该对象\nquot;; // 使用移动坐标将数据从 ptr1 转移到 ptr2 std::unique_ptrlt;Datagt; ptr2 = std::move(ptr1); //此时 ptr1 为空,ptr2 拥有对象 if (ptr1 == nullptr) { std::cout lt;lt; quot;ptr1 现在为 null\nquot;; } if (ptr2 != nullptr) { std::cout lt;lt; quot;ptr2 拥有值为: quot;lt;lt; ptr2-gt;value lt;lt; quot;\nquot;; } return 0;} // ptr2解析结构,Data被模拟登录后复制
输出:
立即学习“C免费学习笔记(研究)”;Data(42)createdptr1拥有objectptr1现在为nullptr2拥有Data with value:42Data(42)destroyed登录后复制std::shared_ptr 与移动的共享共享
std::shared_ptr登录后复制登录后复制使用引用计数管理对象,允许多个指针共享相同对象。虽然它支持移动语义,但移动操作并不会改变引用计数的本质,只是将资源从一个实例“转移”以提升效率。
移动shared_ptr登录后复制通常用于避免备份返回,尤其是在转发或时。
#include lt;iostreamgt;#include lt;memorygt;void process_data(std::shared_ptrlt;Datagt;ptr) { std::cout lt;lt;quot;处理数据:quot;lt;lt;ptr-gt;值lt;lt;quot;,引用计数:quot;lt;lt;ptr.use_count()lt;lt;quot;\nquot;;}int main() { auto shared1 = std::make_sharedlt;Datagt;(100); std::cout lt;lt;quot;初始引用计数: quot;lt;lt;shared1.use_count() lt;lt;quot;\nquot;; // 移动shared1到函数参数,避免增加引用计数的process_data(std::move(shared1)); //shared1 已被移动,通常为空(但标准不强制置空,实践中常为空) if (!shared1) { std::cout lt;lt; quot;shared1 移动后为空\nquot;; } return 0;} // 此处考虑登录后复制的对象
输出学习:
立即学习“C 免费学习笔记(研究)”;Data(100) 创建初始引用数: 1处理中数据: 100, ref count: moveData(100) 销毁后 1shared1 为空登录后复制在函数间传递语音
移动语义常用于工厂函数返回智能指针,避免复制并明确的药品归属。std::unique_ptrlt;Datagt; create_data(int value) { return std::make_uniquelt;Datagt;(value); // 自动使用移动语义}int main() { auto data_ptr = create_data(200); std::cout lt;lt;quot;接收到的数据值为:quot;lt;lt;data_ptr-gt;value lt;lt;quot;\nquot;;return 0;}登录后复制
这里返回unique_ptr登录后复制登录后复制登录后复制会触发移动(或C 17后的隐式移动),调用方直接获得副本。
基本上就这些。通过移动语义,C智能指针能够安全地高效地管理动态资源,尤其是独特的_ptr登录后复制登录后复制登录后复制的移动明显表达了世界卫生组织的转移。
以上就是C智能指针移动标志转移样本的详细内容文章,更多请关注乐哥常识网相关!
