【智能指针】两个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 @   OXYGEN1  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
点击右上角即可分享
微信分享提示