近期在补充和梳理C++方面的知识的时候,遇到了WeakPtr这个概念和用法,不甚明白,Google出了一堆文字,包括Boost的shared_ptr和weak_ptr的比较,以及其他一些博客里面给的例子以及解释。

其中有一个是这样解释的,原文大意:在C++的weak_ptr里面,有两类指针,一类是拥有对象的生命周期;另一类不拥有,只有访问权。

在这里,我就有点不明白,这两类指针,到底会在编写上面,或者形式上面,有什么区别呢?

或者说weak_ptr到底要解决编程当中的什么问题呢? 为什么会有这个类型被提出?

经过和一位朋友的讨论,有了答案。

比如现在有两个函数

class A;

void Func1(A* a);

void Func2(A* a);

A* a = new A;

Func1(a);

Func2(a);

他们在同一个作用域的时候,a 被释放后,惯有的操作是 a = NULL这个时候Func2 或者 Func1中都可以判断到这个变化。

但是如果Func1在另外一个线程/进程里面,你在传递过来的时候a并不是空的a,但是指向的对象,已经被释放了,这个指针已经不在有权限去访问了。那么就会出现问题。

所以weak_ptr就出现了,让你在使用资源之前,先去问下HasWeakPtr() 如果有,那么表明这个资源还没有被释放,可以放心去用,否则就应该不能再使用了。

以往的代码,写法: if (a) {}

但是*a 已经被释放之后,其实a并没有在上下文被a  = NULL 所以a 还是指向那个地址,但是地址指向的内容已经非法了。

一点点小认识,希望对于大家对weak_ptr的理解有所帮助。

05-02 06:46