【问题标题】:why i can't cast nullptr to weak_ptr<>为什么我不能将 nullptr 转换为 weak_ptr<>
【发布时间】:2012-07-02 04:09:04
【问题描述】:
class MyClass {
public:
     MyClass(std::weak_ptr<MyClass> parent){}
}

我想这样做:

auto newInstance = std::make_shared<MyClass>(nullptr);

或者weak_ptr参数的默认值为null,如:

void function(int arg,std::weak_ptr<MyClass> obj = nullptr);

但是,我需要这样做:

auto newInstance = std::make_shared<MyClass>(std::shared_ptr<MyClass>(nullptr));

这是为什么呢?

【问题讨论】:

  • 顺便说一句,下次在你的问题中也包括编译器错误

标签: c++ casting null shared-ptr weak-ptr


【解决方案1】:

因为概念上的weak_ptr 只能从另一个weak_ptrshared_ptr 构造。从原始指针构造是没有意义的,不管它是不是nullptr

您可以在尝试使用nullptr 的地方使用默认构造的weak_ptr (std::weak_ptr&lt;MyClass&gt;()):

auto newInstance = std::make_shared<MyClass>(std::weak_ptr<MyClass>());
void function(int arg,std::weak_ptr<MyClass> obj = std::weak_ptr<MyClass>());

【讨论】:

  • nullptr 具有特殊类型 nullptr_t,因此无法将原始指针隐式转换为 nullptr_t。因此,我认为没有任何理由禁止 weak_ptr&lt;T&gt;(nullptr)
  • @magras 我几年前写了这个答案,我有点同意你的看法。从根本上讲,弱指针需要关联到 shared_ptr 或不关联是有道理的。标准委员会显然决定 nullptr 没有传达非关联以及默认构造。
  • std::weak_ptr中还有.reset()成员函数
【解决方案2】:

弱指针的主要目的通常是了解可能被其他代码破坏的对象是否仍然存在。从普通指针构造的弱指针怎么可能知道对象是否仍然存在?你能想象出一种可行的方法吗?

【讨论】:

  • 我可以想象,我想。很容易。 :)
  • “弱指针的唯一目的是知道可能被其他代码破坏的对象是否仍然存在”有点令人困惑。我会说这是weak_ptr的设施。智能指针的目的是自动化内存管理。此外,weak_ptr 还有更多功能:(1)正如您所说,观察对象而不影响其生命周期(2)防止所谓的“保留周期”(当有一圈对象通过共享指针相互引用从而保持所有对象活着并导致内存泄漏)(3)可以引用指向对象返回shared_ptr。
  • 当你希望weak_ptr在构造函数中自动构造为nullptr时怎么样?那是我需要这个功能的时候。
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 2022-01-16
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多