std::move可以与智能指针一起使用,以实现智能指针所有权的转移。对于std::unique_ptr,由于它不允许复制,但允许移动,因此std::move是实现其所有权转移的关键工具。对于std::shared_ptr,虽然复制和移动都是允许的,但使用std::move可以避免不必要的复制操作,提高效率。
而由于std::move()固定返回右值,所以std::move()只会有std::forward()版本1的情况。此处就略去举例了,std::move()很简单。 总结 std::move()及std::forward()都可以使所有权发生转移(移动语义),但是std::move()的发生具有强制性及鲁棒性,其使得所有权一定会发生转移。而std::forward()会由于传入参数类型...
T&b){Ttemp(std::move(a));// 调用移动构造函数创建临时对象temp,并接管a的资源a=std::move(b)...
std::unique_ptr<MyClass> ptr2 = std::move(ptr1); // ptr1现在为空 if(ptr1 ==nullptr) { std::cout <<"ptr1 is null\n"; } // ptr2现在拥有对象 ptr2->doSomething(); // 离开作用域时,ptr2自动删除对象 } std::shared_ptr 概述 std::shared_ptr是一种共享所有权的智能指针。多个shar...
c++11中常用的智能指针有shared_ptr,unique_ptr与weak_ptr。 unique_ptr是独占型指针,其计数永远为1,无拷贝构造函数,但可以使用std::move转移资源所有权。 weak_ptr没有资源所有权,一般用来辅助shared_ptr使用,多使用于多线程,循环等场景。 shared_ptr可以多个指针绑定同一对象,同一堆空间每多一个shared_ptr指向该...
} PacketCache<RtpPacket>::inputPacket(rtp->type== TrackVideo,std::move(rtp), keyPos); boolis_video = rtp->type== TrackVideo; PacketCache<RtpPacket>::inputPacket(is_video,std::move(rtp), keyPos); } voidclearCache()override{
std::unique_ptr 是一种独占的语义,即只允许一个智能指针引用裸指针,这区别于 std::shared_ptr 允许多个 shared_ptr 引用同一个裸指针,它没有引用计数,它的性能比 shared_ptr 会高一点。
右值引用、std::move 和 std::forward 是 C++11 中的最重大语言新特性之一。就算我们不主动去使用右值引用,它也在影响着我们的编码,这是因为STL的 string、vector 等类都经过了右值引用的改造。由于现在的 IDE 有很多优化提示,我们也会在不经意间使用了右值引用,智能指针 unique_ptr 的实现也和右值引用有关。
std::unique_ptr<int>sp1(std::move(sp)); 1. 2. 3. std::move将sp持有的堆内存转移给sp1后,sp不再持有堆内存的引用,变成一个空的智能指针对象。 那么,是不是所有的对象,都可以用std::move操作呢?答案是否定的,只有实现了移动构造函数或移动运算符的类才可以。恰恰std::unique_ptr实现了二者。
std::weak_ptr:配合std::shared_ptr使用的智能指针,不控制对象的生命周期,在std::shared_ptr实例之间不会形成循环引用。 所有权转移(Ownership Transfer):你可以通过std::move来转移std::unique_ptr的所有权,因为它们不能被复制,只能被移动。 自定义删除器(Custom Deleters):你可以为std::unique_ptr和std::shar...