【智能指针】两个unique_ptr互指会有什么问题?

两个独占式智能指针unique_ptr互指会有什么问题?看如下代码:

#include <iostream>
#include <memory>
 
using namespace std;
 
class B;
class A {
public:
    unique_ptr<B> pb_;
    ~A() {
        cout << "destructor of a" << endl;
    }
};
 
class B {
public:
    unique_ptr<A> pa_;
    ~B() {
        cout << "destructor of b" << endl;
    }
};
 
void fun() {
 
    A *a = new A;
    B *b = new B;
    a->pb_ = unique_ptr<B>(b);
    b->pa_ = unique_ptr<A>(a);
    delete a;
    //delete b;
}
 
int main() {
    fun();
    return 0;
}

出现现象:

出现原因:delete a 做的操作是执行a的析构函数并释放a指针指向的那块内存,因此指向B类对象的智能指针pb_要被释放掉,pb_被释放,因为独占式智能指针的性质,这时pb_指向的那个对象的析构函数也要被执行并回收那个对象的内存,pa_被释放,pa_指向的对象也要被释放,此时,a指向的对象还在,如此循环……

引出个子问题,变量的释放顺序:

#include <iostream>
#include <memory>
 
using namespace std;
 
class B;
class C;
class D;
class A {
public:
    unique_ptr<B> pb_;
    unique_ptr<C> pc_;
    unique_ptr<D> pd_;
 
    ~A() {
        cout << "destructor of a" << endl;
    }
};
 
class B {
public:
    unique_ptr<A> pa_;
    ~B() {
        cout << "destructor of b" << endl;
    }
};
 
class C {
public:
    ~C() {
        cout << "destructor of c" << endl;
    }
};
 
class D {
public:
    ~D() {
        cout << "destructor of d" << endl;
    }
};
 
void fun() {
 
    A *a = new A;
    B *b = new B;
    C *c = new C;
    D *d = new D;
    a->pb_ = unique_ptr<B>(b);
    a->pc_ = unique_ptr<C>(c);
    a->pd_ = unique_ptr<D>(d);
    b->pa_ = unique_ptr<A>(a);
    delete a;
 
    //delete b;
 
}
 
int main() {
    fun();
    return 0;
}

所以变量是从下往上释放……

posted @ 2022-06-11 16:22  OXYGEN1  阅读(38)  评论(0)    收藏  举报