1.什么是强智能指针什么是弱智能指针?
强智能指针就是可以改变资源的引用计数的指针,并且可以访问资源;弱智能指针是不可以改变资源的引用计数的指针,要想访问资源需要提升成强智能指针。
2.什么是交叉引用问题?
类A有一个shared_ptr<B>作为成员变量,类B有一个shared_ptr<A>作为成员变量。在栈上定义一个A类型的对象a并用shared_ptr去管理,同样的在栈上定义一个B类型的对象b也用shared_ptr去管理。用a给B的成员变量赋值,用b给A的成员变量赋值。此时引用类A与类B的引用计数都为2,当对象a或者对象b出作用域析构的时候只会引用计数减1,并不会真正的析构,造成资源泄漏问题!
3.怎么解决交叉引用问题?
定义的时候用shared_ptr,引用的时候用weak_ptr。
下面是一段简单的示例代码
usingnamespacestd; classB; classA{ public: A() { cout<<"A()"<<endl; } ~A() { cout<<"~A()"<<endl; } voidtestA() { cout<<"非常好用的方法"<<endl; } weak_ptr<B>_ptrb; }; classB{ public: B() { cout<<"B()"<<endl; } ~B() { cout<<"~B()"<<endl; } voidfunc() { shared_ptr<A>ps=_ptra.lock(); if (ps!=nullptr) { ps->testA(); } } weak_ptr<A>_ptra; }; intmain(void) { shared_ptr<A>pa(newA()); shared_ptr<B>pb(newB()); pa->_ptrb=pb; pb->_ptra=pa; cout<<pa.use_count() <<endl; cout<<pb.use_count() <<endl; pb->func(); return0; }