C++智能指针之shared_ptr与weak_ptr 防止内存泄漏黄金搭档

发布于:2022-12-30 ⋅ 阅读:(152) ⋅ 点赞:(0)

C++智能指针之shared_ptr与weak_ptr 防止内存泄漏黄金搭档

智能指针并不是指针,它是一个栈上定义的类对象,托管了堆区对象。当栈上的智能指针对象出栈时,所托管的堆区对象自动进行析构,栈上对象出栈自动销毁,因为出栈即自动调用析构。

#include <iostream>
#include <memory>
using namespace std;
class B;
class A{
public:
   shared_ptr<B> ptr_b;
public:
    A(){
        cout << "A的构造" << endl;
    }
    ~A(){
        cout << "A的析构" << endl;
    }
    void slot_function(){
        cout << "接收到了信号,并执行槽函数的逻辑" << endl;
    }
};

class B{
public:
    shared_ptr<A> ptr_a;
public:
    B(){
        cout << "B的构造" << endl;
    }
    ~B(){
        cout << "B的析构" << endl;
    }
    //两个对象之间的互相通信
    void signals(){
        cout << "发出信号" << endl;
        ptr_a->slot_function();
    }

};
int main()
{
    shared_ptr<A>pa(new A);
    shared_ptr<B>pb(new B);
    pa->ptr_b=pb;
    pb->ptr_a=pa;
    pb->signals();
    return 0;
}

代码执行结果(Qt Creator 4.11.1 调试)
在这里插入图片描述
所谓的共享智能指针就是可以有多个智能指针对象托管同一块堆一上的资源。shared_ptr就包括了一个引用记数器,对这个托管同一资源的智能指针对象进行管理。

内置一个引用计数器,只有计数器为0时,才会释放资源,因为涉及了交叉引用,share_ptr会出现内存泄漏的现象。所以要使用weak_str对资源进行弱引用。
在这里插入图片描述
使用weak_str的版本

#include <iostream>
#include <memory>
using namespace std;
class B;
class A
{
public:
    weak_ptr<B> ptr_b;
public:
    A()
    {
        cout << "A的构造" << endl;
    }
    ~A()
    {
        cout << "A的析构" << endl;
    }
    void slot_function()
    {
        cout << "接收到了信号,并执行槽函数的逻辑" << endl;
    }
};

class B
{
public:
    weak_ptr<A> ptr_a;
public:
    B()
    {
        cout << "B的构造" << endl;
    }
    ~B()
    {
        cout << "B的析构" << endl;
    }
    //两个对象之间的互相通信。
    void signals()
    {
        cout << "发出信号" << endl;
        shared_ptr<A> temp = ptr_a.lock();
        if(temp != nullptr)
        {
            temp->slot_function();
        }
    }
};

int main()
{
    shared_ptr<A> pA(new A);
    shared_ptr<B> pB(new B);
    pA->ptr_b = pB;
    pB->ptr_a = pA;
    pB->signals();
    return 0;
}

代码执行结果:
在这里插入图片描述
使用的时机:

当使用智能指针直接托管堆上资源时(智能指针对象后面跟着new时)使用强引用智能指针shared_ptr;

当使用智能指针之间互相赋值时或交叉引用时,使用弱引用智能指针weak_ptr,这样避免资源泄漏的问题

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到