一、产生原因 weak_ptr的产生,主要是为了配合shared_ptr的使用,对于shared_ptr来说,有一种循环引用会导致shared_ptr的引用计数一直不能变为0,如此以来导致内存一直不能释放的掉...Program ended with exit code: 0 除此之外,weak_ptr也具有弱引用特性,不拥有对象,只有延迟到尝试调用Lock()时才会有可能临时拥有对象: 只是持有一个没有拥有权的被...二、特性 weak_ptr的特性如下所示: 1.不具有普通指针的行为,没有重载operator*和->。 2.它的最大作用在于协助shared_ptr工作,像旁观者那样观测资源的使用情况。...3.weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。 4.weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。...weak_ptr的使用特点: 1.使用weak_ptr的成员函数use_count()可以观测资源的引用计数, 另一个成员函数expired()的功能等价于use_count()==0, 但更快,表示被观测的资源
一、概念 weak_ptr是一种不控制所指向对象生存期的智能指针,它指向一个shared_ptr管理的对象 拥有“弱”共享的特点 最重要的特点 一个对象被多个shared_ptr类所指向时,就会拥有多个引用计数...但是当weak_ptr指向一个shared_ptr类所指向的对象时,该对象的引用计数不会增加 因此,当最后一个对象的最后一个shared_ptr类被释放时,该对象会被释放。...即使此时仍有weak_ptr指向该对象,该对象的内存仍然会被释放 二、weak_ptr类的基本使用 我们需要用一个shared_ptr类来初始化weak_ptr类 auto p=make_shared...四、lock函数的使用 用来检测weak_ptr所指的对象是否仍然存在,如果存在就继续访问,不存在则做相应的处理 返回值: 如果weak_ptr所指的shared_pre引用计数为0,返回一个空的shared_ptr...否则,返回一个shared_ptr对象 auto p=make_shared(42); weak_ptr wp(p); if(shared_ptr np=wp.lock(
1、为什么需要weak_ptr? 在正式介绍weak_ptr之前,我们先来回忆一下shared_ptr的一些知识。...为了解决类似这样的问题,C++11引入了weak_ptr,来打破这种循环引用。 2、weak_ptr是什么?...3、weak_ptr如何使用? 接下来,我们来看看weak_ptr的简单用法。...3.1如何创建weak_ptr实例 当我们创建一个weak_ptr时,需要用一个 shared_ptr 实例来初始化 weak_ptr,由于是弱共享,weak_ptr 的创建并不会影响 shared_ptr...A Destructor... 1 3.3如何使用weak_ptr weak_ptr并没有重载 operator->和 operator *操作符,因此不可直接通过weak_ptr使用对象,典型的用法是调用其
为了解决这个问题,可以使用弱引用指针weak_ptr。...③weak_ptr 在 C++ 中,weak_ptr 是一种智能指针(smart pointer),用于解决循环引用问题。...weak_ptr 具有以下特点和用法: 弱引用:因为 weak_ptr 不会增加引用计数,所以当所有 shared_ptr 都释放后,weak_ptr 将自动失效。...通过 shared_ptr 创建:通常,我们使用 shared_ptr 来初始化 weak_ptr。这样可以确保 weak_ptr 观察的对象仍然存在。...reset:重置 weak_ptr。
wp1; weak_ptr wp2(wp1); weak_ptr wp3(sp); weak_ptr wp4; wp4 = sp...; weak_ptr wp5; wp5 = wp3; return 0; } weak_ptr wp1;构造了一个空weak_ptr对象 weak_ptr... wp2(wp1);通过一个空weak_ptr对象构造了另一个空weak_ptr对象 weak_ptr wp3(sp);通过一个shared_ptr对象构造了一个可用的weak_ptr...实例对象 wp4 = sp;通过一个shared_ptr对象构造了一个可用的weak_ptr实例对象(这是一个隐式类型转换) wp5 = wp3;通过一个weak_ptr对象构造了一个可用的weak_ptr...通过调用std::weak_ptr类提供的lock()方法来获取管理所监测资源的shared_ptr对象 通过调用std::weak_ptr类提供的reset()方法来清空对象,使其不监测任何资源
这里你仍然有个疑问,weak_ptr不能用普通的pointer替代,回答这个问题前,我们来挖掘看看weak_ptr到底还有其他的收益吗 以下这个例子显示了3个shared指针sp1,sp2和sp3拥有了一块对象...\n"; } 2.2 weak_ptr weak_ptr不能使用operator*和operator->,而且也没有get()函数。weak_ptr一般和shared_ptr配套使用。...2.2.1 weak_ptr的初始化和赋值 weak_ptr默认是空的,不指到任何对象。它可以接受shared_ptr或者另一个weak_ptr的赋值。...\n"; } 2.2.2 使用weak_ptr weak_ptr不能直接访问对象,只能先用lock()函数获取到shared_ptr,lock()函数会检验对象是否还存在。...weak_ptr默认是空的,不指像任何对象。它可以接受shared_ptr或者另一个weak_ptr的赋值。
为避免循环引用导致的内存泄露,就需要使用 weak_ptr。...然而,weak_ptr 并不是完美的,因为 weak_ptr 不持有对象,所以不能通过 weak_ptr 去访问对象的成员,例如: struct Square { int size = 0; }...事实就是这样,实际上 weak_ptr 只是作为一个转换的桥梁(proxy),通过 weak_ptr 得到 shared_ptr,有两种方式: 调用 weak_ptr 的 lock() 方法,要是对象已被析构...既然 weak_ptr 不持有对象,也就是说 weak_ptr 指向的对象可能析构了,但 weak_ptr 却不知道。...所以需要判断 weak_ptr 指向的对象是否还存在,有两种方式: weak_ptr 的 use_count() 方法,判断引用计数是否为 0。
不能 智能指针 unique_ptr、shared_ptr 和 weak_ptr三个,那么问题来了 一个不能代替全部吗?...不能 shared_ptr vs weak_ptr shared_ptr 使用条件:有多个使用者共同使用同一个对象 假如 一个类成员 是指针,这个普通类 可以被值拷贝。...boost\smart_ptr\weak_ptr.hpp 如果 weak_ptr 指向某一 shared_ptr 指针拥有的堆内存, 则 weak_ptr 也指向该块存储空间(可以访问,但无所有权) weak_ptr...sp2->_prev = sp1; //为什么:shared_ptr 转变成 weak_ptr 不增加 shared_ptr引用计数呢?...敲黑板: 利用shared_ptr和互斥锁来模拟读写锁 用weak_ptr解决shared_ptr的环形引用问题 unique_ptr ?
R.24: Use std::weak_ptr to break cycles of shared_ptrs R.24: 使用std::weak_ptr打破share_ptrs造成的循环 Reason...private: std::shared_ptr forward_reference_; }; class bar { public: explicit bar(const std::weak_ptr...shared_back_reference = back_reference_.lock()) { // Use *shared_back_reference } } private: std::weak_ptr...If we could statically detect cycles, we wouldn't need weak_ptr ??? 差不多不可能。...如果你能静态检查到循环,我们将不需要weak_ptr。
,这个weak_ptr用来观察this智能指针,调用shared_from_this()方法是,会调用内部这个weak_ptr的lock()方法,将所观察的shared_ptr返回。...4.3、weak_ptr解决循环引用问题在shared_ptr提到智能指针循环引用的问题,因为智能指针的循环引用会导致内存泄漏,可以通过weak_ptr解决该问题,只要将A或B的任意一个成员变量改为weak_ptr...4.4、weak_ptr使用注意事项weak_ptr在使用前需要检查合法性。...直到最后一个weak_ptr对象被析构,这块“堆”存储块才能被回收。否则weak_ptr无法指到自己所容纳的那个指针资源的当前状态。...weak_ptr要和shared_ptr搭配使用,不能单独使用weak_ptr。weak_ptr的lock()使用是要先调用lock()再调用expired()。
weak_ptr 是一种不控制对象生命周期的智能指针, 它指向一个 shared_ptr 管理的对象....weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少...如果把其中一个改为weak_ptr就可以了,我们把类A里面的shared_ptr pb_,改为weak_ptr pb_ ,运行结果如下: 1 1 1 2 B delete A delete 这样的话,资源...注意:我们不能通过weak_ptr直接访问对象的方法,比如B对象中有一个方法print(),我们不能这样访问,pa->pb_->print(),因为pb_是一个weak_ptr,应该先把它转化为shared_ptr...共享的对象的引用计数. reset 将 weak_ptr 置空. weak_ptr 支持拷贝或赋值, 但不会影响对应的 shared_ptr 内部对象的计数. share_ptr和weak_ptr的核心实现
通常可以使用 std::weak_ptr 来解决循环引用的问题。...std::weak_ptr 允许共享资源但不拥有它,它是 std::shared_ptr 的弱引用。...与 std::shared_ptr 不同,std::weak_ptr 并不增加引用计数,因此它不会影响资源的生命周期。...以下是 std::weak_ptr 的一些重要特点和用法: 弱引用: std::weak_ptr 是一个弱引用,它不增加资源的引用计数,因此不会影响资源的生命周期。...最后,我们释放了 sharedPtr,并再次检查了 std::weak_ptr 是否有效。
weak_ptr可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。...weak_ptr可以使用一个非常重要的成员函数lock(),从被观测的shared_ptr获得一个可用的shared_ptr对象,从而操作资源。 ...简单实现:weak_ptr的典型实现存储二个指针,即指向控制块的指针和作为构造来源的shared_ptr的存储指针。 ...() { // construct empty weak_ptr object } template weak_ptr(const shared_ptr...(_Other); } template weak_ptr(const weak_ptr& _Other, typename
std::weak_ptr: std::weak_ptr 是一个不控制资源生命周期的智能指针,是对对象的一种弱引用,只是提供了对其管理的资源的一个访问手段,引入它的目的为协助 std::shared_ptr...std::weak_ptr 可以从一个 std::shared_ptr 或另一个 std::weak_ptr 对象构造,std::shared_ptr 可以直接赋值给 std::weak_ptr ,也可以通过...//通过赋值运算符得到一个std::weak_ptr对象 std::weak_ptr sp3 = sp1; std::cout << "use count: " <<...sp1.use_count() << std::endl; //通过一个std::weak_ptr对象得到另外一个std::weak_ptr对象 std::weak_ptr...,同时 std::weak_ptr 类也没有重写 operator!
std::weak_ptr 不能直接访问所管理的内存,需要将其转换为 std::shared_ptr 才能访问内存。...:弱指针 std::weak_ptr 是 C++ 标准库中的另一种智能指针类,它用于解决 std::shared_ptr 的循环引用问题。...创建 std::shared_ptr 和 std::weak_ptr:示例创建了 std::shared_ptr 来管理整数对象,并使用 std::weak_ptr 来观察该对象。...弱引用的对象释放: std::shared_ptr 所有权结束后,std::weak_ptr 不会阻止对象的释放。...来观察 sharedInt std::weak_ptr weakInt = sharedInt; // 使用 std::weak_ptr 来访问对象 if (auto
std::weak_ptr 只可以从⼀个 std::shared_ptr 或另⼀个 std::weak_ptr 对象构造,其构造和析构不会引起引⽤记数的增加或减少。...std::weak_ptr 是⽤来解决 std::shared_ptr 相互引⽤时产生的死锁问题。...std::weak_ptr 是对一个对象的⼀种弱引⽤,不会增加对象的引⽤计数,和 std::shared_ptr 之间可以相互转化,std::shared_ptr 可以直接赋值给 std::weak_ptr...,std::weak_ptr 可以通过调⽤ lock() 函数来获得 std::shared_ptr。...解决办法就是把其中⼀个智能指针改为 std::weak_ptr,这样就不会有问题了。 特点: 不增加引用计数,避免循环引用。
std::weak_ptr std::weak_ptr 是一种非 RAII 的弱引用智能指针,设计用于解决 shared_ptr 的循环引用问题。...使用 weak_ptr 解决循环引用 template class weak_ptr { public: weak_ptr() {} weak_ptr(const...weak_ptr 的特性与用法 打破循环引用 weak_ptr 最常见的应用场景是配合 shared_ptr 解决循环引用问题。...weak_ptr** 的作用**: 使用 weak_ptr 代替某些 shared_ptr,让引用关系不增加引用计数,从而打破循环引用。...相比直接使用裸指针(如 raw pointer)观察资源,weak_ptr 提供了更安全的方式: 在资源被释放时,weak_ptr 会自动检测到过期状态,避免了悬空指针问题。
weak_ptr是一个弱引用的智能指针,它可以与shared_ptr一起使用。...weak_ptr不会增加所管理的对象的引用计数,因此它不会影响对象的生命周期。可以通过weak_ptr的lock()成员函数来获取一个指向所管理的对象的shared_ptr。...需要注意的是,在使用lock()函数之前,需要判断weak_ptr是否已经过期,即判断其指向的对象是否已经被销毁。 ...C++中有三种智能指针:unique_ptr、shared_ptr和weak_ptr。每种智能指针都有其特点,程序员可以根据实际情况选择使用。...在使用weak_ptr的lock()函数之前,需要判断weak_ptr是否已经过期,即判断其指向的对象是否已经被销毁。
std::weak_ptr有什么特点呢?...weak_ptr被设计为与shared_ptr共同工作,可以从一个shared_ptr或者另一个weak_ptr对象构造,获得资源的观测权。...但weak_ptr没有共享资源,它的构造不会引起指针引用计数的增加。同样,在weak_ptr析构时也不会导致引用计数的减少,它只是一个静静地观察者。...1.2.3 std::weak_ptr支持的调用 weak_ptr w; //空weak_ptr可以指向类型为T的对象 weak_ptr w(shared_ptr sp); //...与sp指向相同对象的weak_ptr, T必须能转换为sp指向的类型 w = p; //p可以是shared_ptr或者weak_ptr,赋值后w和p共享对象 w.reset(); //weak_ptr
weak_ptr 设计上与 shared_ptr 搭配使用,因为 shared_ptr 存在一个问题,就是循环引用计数递增而导致的内存泄漏。...所以 weak_ptr 的作用就来了: 【伪代码】 class node{ weak_ptr start; weak_ptr end; } shared_ptr...而 weak_ptr 是弱引用,弱引用是虽然对象还活着,但是这个引用则可有可无。...所以,weak_ptr 的作用就是作为一个 "观察者" 访问 shared_ptr 本身,而不是 shared_ptr 所托管的资源。...shared_ptr r_brain = make_shared(); // 创建 weak_ptr weak_ptr w_brain(r_brain);
领取专属 10元无门槛券
手把手带您无忧上云