C++智能指针——weak_ptr详解

前言
  weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少.  同时weak_ptr 没有重载*和->但可以使用 lock 获得一个可用的 shared_ptr 对象。C++智能指针——share_ptr详解 使用陷阱中提到循环引用导致对象无法被析构的问题,通过weak_ptr可以解决

#ifndef testA_H
#define testA_H

#include 
using namespace std;

class testB;
class testA {
    public:
    testA();
    ~testA();
    void testFunA(const shared_ptr &sptr);

    private:
    shared_ptr m_sptrB;
};
#endif

=====================================================================
#include "testA.h"
#include 
using namespace std;

testA::testA(){}

void testA::testFunA(const shared_ptr &sptr) {
    cout<<"testFunA"<

using namespace std;
class testA;
class testB {
    public:
    testB();
    ~testB();

    void testFunB(const shared_ptr &sptr);

    private:
    weak_ptrm_sptrA; //使用weak_ptr替换shared_ptr
};
#endif

=====================================================================
#include "testB.h"
#include 
using namespace std;

testB::testB(){}

void testB::testFunB(const shared_ptr &sptr) {
    cout<<"testFunB"< sptra(ta);
    shared_ptr sptrb(tb);

    sptra->testFunA(sptrb);
    sptrb->testFunB(sptra);
}

输出结果:

testFunA
testFunA m_sptrB count = 2
testFunB
testFunB m_sptrA count = 1  //在testB类中用weak_ptr不会修改引用计数
~testA destructor
~testB destructor

weak_ptr常用函数介绍:

  • use_count函数,表示当前引用计数
  • reset函数,表示删除当前被管理的对象。
  • expired函数,表示判断被管理的对象是否被删除,相当于use_count()==0,如果被删除则返回true,否则返回false。
    shared_ptr sptr(new int(2));
    weak_ptr wptr(sptr);
    cout<<"wptr count = "<    shared_ptr sp1,sp2;
    weak_ptr wp;
    sp1 = make_shared (20);    // sp1
    wp = sp1;                       // sp1, wp

    cout<<"wp count = "<    std::shared_ptr sp1 (new int(10));
    std::shared_ptr sp2 (new int(20));

    std::weak_ptr wp1(sp1);
    std::weak_ptr wp2(sp2);

    cout<<"wp1 = "<<*wp1.lock()<

你可能感兴趣的:(C++学习)