zoukankan      html  css  js  c++  java
  • weak_ptr的一点认识

    近期在补充和梳理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的理解有所帮助。

  • 相关阅读:
    模块化
    ES6中的let
    ES6中的块级作用域
    Mobile 移动端
    H5离线缓存
    nginx 配置步骤
    虚拟路径的配置
    Apache和php的相关配置
    TCP/IP协议
    PHP中的文件操作
  • 原文地址:https://www.cnblogs.com/lidabo/p/3989975.html
Copyright © 2011-2022 走看看