繁体   English   中英

正确使用智能指针

[英]Correctly using smart pointers

我无法通过智能指针正确组织事情。 几乎到了我不得不回到使用普通指针的程度。

我想在整个程序中轻松使用智能指针,而不必每次都输入shared_ptr<...> 我立刻想到的一个解决方案是创建一个模板类并向其添加一个typedef sptr ,这样我就可以进行class Derived : public Object < Derived > ..然后使用Derived::sptr = ...但这显然是可怕的因为它不适用于从Derived对象派生的另一个类。

甚至做typedef shared_ptr<..> MyObjectPtr很糟糕,因为为了一致性,需要为每种智能指针完成它,或者至少对于unique_ptr和shared_ptr。

那么人们使用智能指针的标准方式是什么? 因为坦率地说,我开始认为使用它们太麻烦了。 :/

那么人们使用智能指针的标准方式是什么?

很少。 您发现使用它们很麻烦的事实表明您过度使用指针。 尝试重构代码以使指针成为异常 ,而不是规则。 shared_ptr特别有它的利基,但它是一个小的:即,当你真正必须在几个对象之间共享资源的所有权。 这是一种罕见的情况。

因为坦率地说,我开始认为使用它们太麻烦了。 :/

同意。 这是不使用指针的主要原因。

有更多方法可以避免指针。 特别是,当您实际需要传递所有权时, shared_ptr实际上只需要拼写出来。 在不处理所有权的函数中,您不会传递shared_ptr或原始指针; 你会传递一个引用,并在调用函数时取消引用指针。

在内部函数中,您几乎不需要拼出类型; 例如,你可以(而且应该)简单地说auto x = …; 而不是shared_ptr<Class> x = …; 初始化变量。

总之 ,您只需要在代码中的极少数地方拼出shared_ptr

我有很多动态创建对象的代码。 因此,使用指针是必要的,因为从一开始就不知道对象的数量。 在一个子系统中创建一个对象,然后将其存储在另一个子系统中,然后将其传递给创建它的子系统进一步处理。 所以我想这意味着使用shared_ptr。 好的设计? 我不知道,但要求子系统创建它拥有的具体对象似乎最合乎逻辑,返回指向该对象的接口的指针,然后将其传递给另一段将与该对象交互的代码通过它的抽象界面。

我可以从工厂方法返回unique_ptr。 但是如果我需要多次传递对象进行处理,那么我会遇到麻烦。 因为在将对象传递给另一个方法之后我仍然需要知道对象,而unique_ptr意味着在执行move()之后我会丢失对象的跟踪。 由于我需要至少有两个对象的引用,这意味着使用shared_ptr。

我听说最常用的智能指针是unique_ptr。 我的申请当然不是这样。 我最终经常使用shared_ptr。 这是否是糟糕设计的标志呢?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM