weak_ptr的主要使用场景,一是用于探查是否内存空间是否有效,用户可以通过expired()或者lock()来检测数据的有效性,以避免空指针。二是可以用于打破循环引用。c++20中的原子智能指针 智能指针的计数器是线程安全,但是其指向的对象的不是线程安全的。如果需要多个线程操作,为了保证安全性,可以 1、直接调用 mutex 的 ...
相反,通过让std::shared_ptr管理数据并将std::weak_ptr提供给数据用户,用户可以通过调用expired()或lock()来检查数据的有效性。 您不能单独使用std::shared_ptr来执行此操作,因为所有std::shared_ptr实例共享数据的所有权,而在删除std::shared_ptr的所有实例之前,这些所有权不会被删除。这是如何使用lock()检查悬...
shared_ptr<ClassA> spA(new ClassA); weak_ptr<ClassA> wpA1(spA); weak_ptr<ClassA> wpA2 = spA; 1. 2. 3. expired函数 weak_ptr并不增加shared_ptr的引用计数,因此有可能发生对象已经析构但是weak_ptr还在的情况,此时使用weak_ptr就必须小心,当对象即将发生析构或者已经析构,expired返回true,expired...
三、C++ 11 创建和使用共享 weak_ptr weak_ptr是为了配合shared_ptr而引入的一种智能指针, 它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期, 也就是将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。 不论是否有weak_ptr指向,一旦最后一个指向对象的shared_ptr被销毁,对象就会被...
C++11新特性之lambda:http://blog.jobbole.com/104548/ C++11新特性之容器相关特性:http://blog.jobbole.com/104563/ 这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr)。 不想看toy code的读者可以直接拉到文章最后看这部分的总结。
weak_ptr本身也是一个模板类,但是不能直接用它来定义一个智能指针的对象,只能配合shared_ptr来使用,可以将shared_ptr的对象赋值给weak_ptr,并且这样并不会改变引用计数的值。查看weak_ptr的代码时发现,它主要有lock、swap、reset、expired、operator=、use_count几个函数,与shared_ptr相比多了lock、expired函数,但是...
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 classAircraft { private: stringm_model; public: intm_flyCount; weak_ptr<aircraft>myWingMan; voidFly() { cout<<"Aircraft type"<<m_model<<"is flying !"<<endl; ...
cout << "weak1 is expired\n"; // weak2 points to new data (5) if(auto tmp = weak2.lock()) cout << *tmp << '\n'; else cout << "weak2 is expired\n"; *///test4 循环引用,导致即使是智能指针也不能释放内存//用weak_ptr解决了循环引用,导致的内存不能释放的问题shared_ptr<teach...
std::weak_ptr是 C++11标准库中引入的一种智能指针,用于解决与std::shared_ptr相关的循环引用问题。 当你使用std::shared_ptr来管理对象的生命周期时,两个或多个std::shared_ptr对象可能会形成一个循环引用,即它们互相持有对方的引用。这会导致引用计数永远不会达到零,从而导致内存泄漏,因为涉及的对象永远不会被...
new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。weak_ptr 传给thread、timer回调,不能使用expired()判断 new XXX(shared_from_this()) 如果用强指针去接,则增加引用计数;弱引用去接,不增加引用计数。auto去接等同强指针。