shared_ptr产生的交叉引用问题

简介: 智能指针方便了程序设计人员对于内存的使用,但是也带来了很多问题。如交叉引用问题、线程安全问题等,本文将详细介绍交叉引用问题。

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。

下面是一段简单的示例代码

#include <iostream>#include <memory>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;
}


相关文章
|
5月前
|
设计模式 C++ 开发者
C++一分钟之-智能指针:unique_ptr与shared_ptr
【6月更文挑战第24天】C++智能指针`unique_ptr`和`shared_ptr`管理内存,防止泄漏。`unique_ptr`独占资源,离开作用域自动释放;`shared_ptr`通过引用计数共享所有权,最后一个副本销毁时释放资源。常见问题包括`unique_ptr`复制、`shared_ptr`循环引用和裸指针转换。避免这些问题需使用移动语义、`weak_ptr`和明智转换裸指针。示例展示了如何使用它们管理资源。正确使用能提升代码安全性和效率。
93 2
|
6月前
|
安全 Linux 编译器
从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr(下)
从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr
41 3
|
6月前
|
安全 编译器 C语言
从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr(中)
从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr
41 1
|
6月前
|
安全 编译器 C语言
从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr(上)
从C语言到C++_36(智能指针RAII)auto_ptr+unique_ptr+shared_ptr+weak_ptr
33 0
shared_ptr能和基于引用计数的智能指针混用吗?
shared_ptr能和基于引用计数的智能指针混用吗?
|
6月前
|
安全 编译器 C++
[C++] 智能指针(shared_ptr、unique_ptr)
[C++] 智能指针(shared_ptr、unique_ptr)
69 1
|
6月前
shared_ptr循环引用问题以及解决方法
shared_ptr循环引用问题以及解决方法
163 0
|
6月前
|
安全 编译器 C++
智能指针shared_ptr、unique_ptr、weak_ptr
智能指针shared_ptr、unique_ptr、weak_ptr
164 0
|
6月前
|
C++
C++智能指针shared_ptr
C++智能指针shared_ptr
47 0
|
11月前
C++11 shared_ptr智能指针
C++11 shared_ptr智能指针
66 0