【智能指针】两个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; }

所以变量是从下往上释放……
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端