为了解决上述小节中 shared_ptr循环引用导致的内存泄露问题,可利用weak_ptr智能指针。 weak_ptr是一个不拥有所有权的智能指针,其主要用来检测shared_ptr的控制块以判断shared_ptr所管理的资源是否存活! weak_ptr提供如下三个有用接口 use_count 返回shared_ptr的引用计数 expired 检查是否shared_ptr所管理的资源已经被...
cppreference.com中关于weak_ptr的使用情景中就有相关描述, 就和我遇到的情况一模一样: 如果你使用的一个对象可能随时会被删除,但是你无法控制何时被删除, 那么你就应该使用weak_ptr, 然后由对象的拥有者使用shared_ptr. 另外, weak_ptr对象在lock()之后会临时的生成一个shared_ptr, 在此期间对象将无法被其它人...
C++11提供了三种智能指针:std::shared_ptr, std::unique_ptr, std::weak_ptr,使用时需添加头文件#include。 shared_ptr shared_ptr 使用引用计数,每一个 shared_ptr 的拷贝都指向相同的内存。每引用它一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,删除...
解决std::shared_ptr循环引用问题的钥匙在weak_ptr手上。weak_ptr对象引用资源时不会增加引用计数,但是它能够通过lock()方法来判断它所管理的资源是否被释放。另外很自然地一个问题是:既然weak_ptr不增加资源的引用计数,那么在使用weak_ptr对象的时候,资源被突然释放了怎么办呢?呵呵,答案是你根本不能直接通过weak_p...
【043】C++中的智能指针(std::unique_ptr, std::shared_ptr, std::weak_ptr) 11:56 【044】C++中的复制与复制构造函数 Copying and Copy Constructors in C++ 21:16 【045】C++中的箭头操作符 The Arrow Operator in C++ 08:00 【046】C++中的动态数组(std::vector)Dynamic Arrays in C++ (std:...
当需要销毁已生产的产品时,只需清空`vector`即可,`shared_ptr`会自动处理销毁问题。接下来,我们来看看如何使用`weak_ptr`。与通常情况下的指针判断方法类似,我们使用`expired()`函数来判断`weak_ptr`是否可使用。如果可以使用,通过`lock()`临时获取所有权,然后执行相应的操作。这样,我们就能确保...
想法总是比做起来简单,因为std::weak_ptr没有解引用操作,所以没办法写出相应的代码。即使能写出来,把解引用和检查分离开来会造成竞争条件:在调用expired和解引用操作中间,另外一个线程可能重新赋值或者销毁std::shared_ptr之前指向的对象,因此,会造成你想解引用的对象被销毁。这样的话,你的解引用操作将产生未定义...
weak_ptr不会增加shared_ptr的引用计数,weak_ptr引用计数指针指向的是shared_ptr的引用计数内存。智能指针引用计数内存有俩个计数:_Uses、_Weaks。weak_ptr会增加_Weaks的值。当_Uses及_Weaks均为0时,引用计数内存才会被释放,可参见后文代码。 基于以上事实可知,可通过weak_ptr::expired()函数判断其跟踪的shared_...
std::weak_ptr 可以从一个 std::shared_ptr 或另一个 std::weak_ptr 创建。它持有一个指向 std::shared_ptr 控制块的指针,但不增加对象的引用计数。当所有的 std::shared_ptr 都被销毁时,对象也会被销毁,此时 std::weak_ptr 会变为空(expired)。
std::weak_ptr提供了一种方式来持有对对象的弱引用,不会增加对象的引用计数。当与std::shared_ptr一起使用时,你可以通过std::weak_ptr安全地访问对象,而不会导致循环引用。当std::shared_ptr指向的对象被删除时,所有相关的std::weak_ptr对象都会变得空无,你可以通过调用expired()函数来检测这一点。