【智能指针】两个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;
}
所以变量是从下往上释放……

浙公网安备 33010602011771号