Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 构造函数中的this()中的弱\u_C++_Constructor_Smart Pointers_Weak Ptr - Fatal编程技术网

C++ 构造函数中的this()中的弱\u

C++ 构造函数中的this()中的弱\u,c++,constructor,smart-pointers,weak-ptr,C++,Constructor,Smart Pointers,Weak Ptr,我知道您不能在构造函数中使用此共享。但是在构造函数中使用来自this的新的弱\u可以吗?根据参考资料: 这是作为一部分的私有可变弱ptr成员的副本 从此启用\u共享\u的 在从构造函数中获取内部存储的弱ptr副本时,我没有发现任何问题,但我可能遗漏了一些内容,因此对此我不确定。您可以调用它,但是弱ptr通常只是空的 此的shared_的意义不仅仅是制作一些shared_ptr,而是获得一个shared_ptr,它与一组现有的shared_ptr指针共享所有权。而弱\u ptr的要点是提供一种获

我知道您不能在构造函数中使用此共享。但是在构造函数中使用来自this的新的
弱\u可以吗?根据参考资料:

这是作为一部分的私有可变弱ptr成员的副本 从此启用\u共享\u的


在从构造函数中获取内部存储的弱ptr副本时,我没有发现任何问题,但我可能遗漏了一些内容,因此对此我不确定。

您可以调用它,但是
弱ptr
通常只是空的

shared_的意义不仅仅是制作一些
shared_ptr
,而是获得一个
shared_ptr
,它与一组现有的
shared_ptr
指针共享所有权。而
弱\u ptr
的要点是提供一种获取
共享\u ptr
的方法,如果当时存在其他
共享\u ptr
指针,则该方法共享所有权,而不会像直接存储
共享\u ptr
那样延长生命周期。因此,如果不存在指向该对象的
共享\u ptr
指针,则
弱\u ptr
不能指向同一对象

请注意,在正常使用中,当您执行以下操作时

std::shared_ptr<MyClass> p(new MyClass);
std::shared_ptr p(新MyClass);
顺序是:

  • 实现调用
    操作符new(sizeof(MyClass))
    以获取一些存储

  • 该实现调用
    MyClass
    的构造函数在该存储中创建一个对象

    • 如果
      MyClass
      继承了
      std::enable\u shared\u从此
      中,它包含一个
      std::weak\u ptr
      子对象。默认构造函数
      弱\u ptr
      用于创建 一个空的智能指针
  • 该实现调用
    std::shared_ptr
    的构造函数来创建智能指针,将指针传递给
    MyClass
    对象

    • shared\u ptr
      的构造函数检查指针是否指向从该专门化继承兼容的
      std::enable\u shared\u的类类型。如果是,则类对象中的
      std::weak_ptr
      子对象将被重新分配为正在构造的
      共享_ptr
      的副本
  • 因此,在
    MyClass
    的构造函数中,您将处于步骤2。但是,来自此()的
    共享\u
    和来自此()的
    弱\u
    使用的内部指针直到步骤3才变得有用

    [在
    std::make_shared
    std::allocate_shared
    期间,
    弱ptr
    也会发生类似的重新分配。在这些情况下,标准显然没有说
    弱ptr
    是在创建完整的指向对象之后分配的,但实现这样做是非常不寻常和意外的在从该
    基子对象构造
    启用_共享_和执行派生类构造函数体之间的某个点上,以某种方式神奇地对
    弱_ptr
    执行某些操作。]


    您可以创建一个
    std::shared_ptr
    ,它从类构造函数中指向
    ,将其存储在其他变量或容器或其他东西中。(但是如果使用默认的删除器,请确保您知道该对象实际上是使用标量
    新建的
    !)在这一点之后,
    从\u this()共享\u
    从\u this()弱
    可以在构造函数中使用,并将返回连接到已创建的
    std::shared_ptr
    的内容。但这似乎与正常的操作方式完全不同。

    用于什么目的?根据
    弱_ptr
    的定义,它实际上是问题的重复“为什么从调用共享_这个调用std::terminate”查看我的答案“您可以创建一个std::shared_ptr,它在类构造函数中指向此点"如果构造函数抛出,那么砰!我知道复制的弱ptr最初是空的。问题是我不知道弱ptr实际上是如何工作的。我认为弱ptr的副本,即使最初是空的,一旦原始弱ptr也变为有效,就会变为有效。好像两个弱ptr都引用了同一个指针,最初可能是nullptr,但在某一点上会变为有效的,所有引用此指针的弱ptr也会变为有效的。