智能指针失效的情况

2020-06-10  本文已影响0人  book_02

1. 智能指针的交叉引用

1.1 正常情况输出

#include <iostream>
#include <memory>

using namespace std;

class B;

class A {
public:
    A() { cout << "A()" << endl; }
    ~A() { cout << "~A()" << endl; }
};

class B {
public:
    B() { cout << "B()" << endl; }
    ~B() { cout << "~B()" << endl; }
};

int main()
{

    {
        shared_ptr<A> pA(new A());
        shared_ptr<B> pB(new B());
    }   // 超出作用域,应当析构

    return 0;
}

结果

A()
B()
~B()
~A()

1.2 交叉引用造成泄漏

#include <iostream>
#include <memory>

using namespace std;

class B;

class A {
public:
    A() { cout << "A()" << endl; }
    ~A() { cout << "~A()" << endl; }

    shared_ptr<B> pb;   // 智能指针指向B
};

class B {
public:
    B() { cout << "B()" << endl; }
    ~B() { cout << "~B()" << endl; }

    shared_ptr<A> pa;   // 智能指针指向A
};

int main()
{

    {
        shared_ptr<A> pA(new A());
        shared_ptr<B> pB(new B());

        pA->pb = pB;    // 给成员智能指针赋值
        pB->pa = pA;    
    }   // 超出作用域,应当析构

    return 0;
}
A()
B()

两个类的析构都没有执行,说明存在内存泄漏了。

2. 解决方法

把类成员的shared_ptr 换成 弱指针 weak_ptr

#include <iostream>
#include <memory>

using namespace std;

class B;

class A {
public:
    A() { cout << "A()" << endl; }
    ~A() { cout << "~A()" << endl; }

    weak_ptr<B> pb;     // 从 `shared_ptr` 换成 `weak_ptr`
};

class B {
public:
    B() { cout << "B()" << endl; }
    ~B() { cout << "~B()" << endl; }

    weak_ptr<A> pa;     // 从 `shared_ptr` 换成 `weak_ptr`
};

int main()
{

    {
        shared_ptr<A> pA(new A());
        shared_ptr<B> pB(new B());

        pA->pb = pB;
        pB->pa = pA;
    }   // 超出作用域,应当析构

    return 0;
}

结果

A()
B()
~B()
~A()

正常析构,解决了内存泄漏。

上一篇 下一篇

猜你喜欢

热点阅读