正在调用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();
我觉得选项I更正确,因为选项II使用了原始指针。但使用原始指针可能不会有什么害处,因为我没有分配或释放。
我经常对这两种选择感到困惑。哪一个更可取?它们是一样的吗?谢谢
原始指针不是敌人。如果没有一个形状或形式,我们就无法用C++编写任何有用的程序。问题是拥有原始指针。它们没有一个与类型相关的明确的所有权语义,因此由程序员来手动管理生命周期这一艰巨任务。如果需要的话,不要害怕将原始指针作为句柄传递。
这就引出了下一点。您演示的两种方法都依赖于原始指针。重载的operator->
必须返回一个原始指针(最终(,以便我们对对象应用成员访问。从本质上讲,第一个版本相当于
v = foo.operator->() -> getvalue();
它的作用与第二种形式完全相同,只是在上面加了句法糖。
你应该更喜欢第一种形式,因为它更短而且可读。但它并没有避免原始指针,这是无法避免的。
之间没有功能差异
//Option I
v=foo->getvalue();
和
//Option II
v=foo.get()->getvalue();
但是选项二更多的是打字,为什么呢?
在这种情况下,两种构造的作用完全相同。
这与智能指针与原始指针无关。原始指针的问题纯粹在于原始拥有指针。原始的非owning指针没有错。
这两个选项在汇编代码中可能会得到相同的结果。第一个选项foo->getvalue()
是首选选项,因为这样可以提供更好的可读性。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 将对象数组的引用传递给函数
- 你能重载对象变量名本身返回的内容吗
- C++使用整数的压缩数组初始化对象
- 唯一 ptr 将所有权移动到包含对象的方法
- 如何传递容器、ptr 和对象不可修改的unique_ptrs容器?
- 在C++中,对象什么时候真正被销毁?delete(ptr)做什么
- 使针对特定托管对象的所有共享 ptr 失效
- ptr<Node> a = 创建对象 < 节点 > ();
- 一个唯一的ptr类如何将它的实例指针传递给它的成员对象
- 从基类ptr的vector对象中擦除
- openv Ptr类.指针对象在调用函数后被删除
- 共享 PTR - C++ 如何使用引用计数管理对象缓存
- 当可以在类对象超出范围之前删除此数据时,类允许访问其数据(通过 ptr/it)是否设计不好
- c++类的析构函数包含ptr到对象的数组
- 如何使用c++ Mat类ptr对象的基本C包装器打印Mat元素?
- 共享Ptr与普通Ptr:声明后的对象创建