std::weak_ptr是解决悬空指针问题的一种很好的方法。仅通过使用原始指针,就不可能知道所引用的数据是否已被释放。相反,通过让std::shared_ptr管理数据并将std::weak_ptr提供给数据用户,用户可以通过调用expired()或lock()来检查数据的有效性。 您不能单独使用std::shared_ptr来执行此操作,因为所有std::shared_ptr...
weak_ptr的主要使用场景,一是用于探查是否内存空间是否有效,用户可以通过expired()或者lock()来检测数据的有效性,以避免空指针。二是可以用于打破循环引用。c++20中的原子智能指针 智能指针的计数器是线程安全,但是其指向的对象的不是线程安全的。如果需要多个线程操作,为了保证安全性,可以 1、直接调用 mutex 的 ...
当std::shared_ptr指向的对象被删除时,所有相关的std::weak_ptr对象都会变得空无,你可以通过调用expired()函数来检测这一点。 下面是一个使用std::weak_ptr解决循环引用问题的例子: #include <iostream>#include <memory>class B; // 前向声明class A {public:std::shared_ptr<B> b_ptr;~A() { std::...
p.reset();//pi没有弱引用了}//4. lock()voidfunc4(){autop1 = make_shared<int>(42); weak_ptr<int>p2(p1);if(!p2.expired()) {autop3 = p2.lock();//返回一个shared_ptr,并且此时强引用计数为2if(p3)cout<< *p3 <<endl;//离开这个范围,强引用计数会恢复为1}else{inttest; test =1...
weak_ptr<int> weak2 = sptr; // weak1 is expired! if(auto tmp = weak1.lock()) cout << *tmp << '\n'; else cout << "weak1 is expired\n"; // weak2 points to new data (5) if(auto tmp = weak2.lock()) cout << *tmp << '\n'; ...
3)当使用weak_ptr的lock方法时,如果所监视的对象未被释放,lock会返回一个指向该对象的shared_ptr,此时返回的shared_ptr会增加对象的引用计数;如果所监视的对象已被释放,lock会返回一个空的shared_ptr,此时不会增加任何引用计数。 4)可以使用std::weak_ptr来解决std::shared_ptr的循环引用和返回this指针的问题。
这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr)。 不想看toy code的读者可以直接拉到文章最后看这部分的总结。 shared_ptr shared_ptr 基本用法 shared_ptr采用引用计数的方式管理所指向的对象。当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计...
weak_ptr本身也是一个模板类,但是不能直接用它来定义一个智能指针的对象,只能配合shared_ptr来使用,可以将shared_ptr的对象赋值给weak_ptr,并且这样并不会改变引用计数的值。查看weak_ptr的代码时发现,它主要有lock、swap、reset、expired、operator=、use_count几个函数,与shared_ptr相比多了lock、expired函数,但是...
(15);std::unique_ptr<int>p4=std::make_unique<int>(10);std::weak_ptr<int>p5=p3;std::cout<<p1->a<<std::endl;std::cout<<p1->b<<std::endl;std::cout<<*p2<<std::endl;std::cout<<*p3<<std::endl;std::cout<<*p4<<std::endl;std::cout<<*p5.lock()<<std::endl;return0;...
weak_ptr引入可以解决shared_ptr交叉引用时无法释放资源的问题。 示例代码: #include<iostream>#include<memory>usingnamespacestd;classB;classA{public:A(){cout <<"A constructor ... "<< endl;} ~A(){cout <<"A destructor ..."<< endl;} ...