正在调用shared_ptr对象方法

Calling shared_ptr object method

本文关键字:ptr 对象 方法 shared 调用      更新时间:2023-10-16

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

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();

我觉得选项I更正确,因为选项II使用了原始指针。但使用原始指针可能不会有什么害处,因为我没有分配或释放。

我经常对这两种选择感到困惑。哪一个更可取?它们是一样的吗?谢谢

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

这就引出了下一点。您演示的两种方法都依赖于原始指针。重载的operator->必须返回一个原始指针(最终(,以便我们对对象应用成员访问。从本质上讲,第一个版本相当于

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

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

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

之间没有功能差异

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

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

但是选项二更多的是打字,为什么呢?

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

这与智能指针与原始指针无关。原始指针的问题纯粹在于原始拥有指针。原始的非owning指针没有错。

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