调用 shared_ptr 对象方法

Calling shared_ptr object method

这似乎是一个非常愚蠢的问题,所以请耐心等待。我在我的程序中使用智能指针代替原始指针。建议我不要使用原始指针或尽可能混合使用两者。我也明白这一点。我也知道只有在必要时才应该使用指针。

class Foo{
  private: int val;
  public: 
    Foo(int v) :val(v){}
    int getvalue() const { return val; }
};

std::shared_ptr<Foo> foo = std::make_shared(Foo(10));

int v;

//Option I
v=foo->getvalue();

//Option II
v=foo.get()->getvalue();

我觉得选项一更正确,因为选项二使用原始指针。但是在这里使用原始指针可能不会受到伤害,因为我没有分配或取消分配。

我经常对这两个选项感到困惑。哪个更好?他们只是一样吗?谢谢

之间没有功能差异
//Option I
v=foo->getvalue();

//Option II
v=foo.get()->getvalue();

但是选项 II 需要输入更多内容,为什么?

两种构造在这种情况下的作用完全相同。

这与智能指针和原始指针没有任何关系。原始指针的问题纯粹是原始 owning 指针。原始非拥有指针没有错。

原始指针不是敌人。没有它们的一种形式,我们就无法用 C++ 编写任何有用的程序。问题是 拥有 原始指针。它们没有与其类型相关联的明确所有权语义,因此程序员需要完成手动管理生命周期的艰巨任务。如果需要,不要害怕将原始指针作为句柄传递。

这将我们带到下一点。您演示的两种方法都依赖于原始指针。重载的 operator-> 必须 return 一个原始指针(最终),以便我们在对象上应用成员访问。本质上,第一个版本相当于

v = foo.operator->() -> getvalue();

它的操作与第二种形式完全相同,只是在上面加了句法糖。

您应该更喜欢第一种形式,因为它更短且更易读。但它并没有避免原始指针,这是不可能避免的。

这两个选项在汇编代码中可能会得到相同的结果。第一个选项 foo->getvalue() 是首选选项,因为这提供了更好的可读性。