C++ 构造函数中的this()中的弱\u
我知道您不能在构造函数中使用此共享。但是在构造函数中使用来自this的新的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的要点是提供一种获
弱\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也会变为有效的。