【问题标题】:Correctly using smart pointers正确使用智能指针
【发布时间】:2014-03-12 10:42:11
【问题描述】:

我无法使用智能指针正确组织事情。几乎到了我不得不重新使用普通指针的地步。

我想让在整个程序中使用智能指针变得容易,而不必每次都输入shared_ptr<...>。我马上想到的一个解决方案是创建一个模板类并在其中添加一个typedef sptr,这样我就可以做class Derived : public Object < Derived > ..,然后使用Derived::sptr = ...,但这显然很可怕,因为它不适用于当时的另一个类派生自 Derived 对象。

甚至做typedef shared_ptr<..> MyObjectPtr 也很糟糕,因为为了保持一致性,或者至少对于unique_ptr 和shared_ptr,都需要对每种智能指针都这样做。

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

【问题讨论】:

  • 您的问题是必须输入shared_ptr<SomeObject>?
  • 也许您应该从描述您实际尝试使用智能指针解决的问题开始?这个问题好像是the X-Y problem的情况。
  • 内存泄漏 == 更大的麻烦
  • 我想在整个应用程序中使用智能指针。只是想确保我做得正确并在正确的位置使用正确的指针并且不想过于冗长。 SomeObject* 肯定比 (std::)shared_ptr 短。还想确保当事实证明 sptrs 会成为某种障碍时,我不会遇到设计问题。每一个这样的语言特性都可能成为未来的障碍。基本上想使用 sptrs 但从一开始就以最健壮和正确的方式这样做,所以我以后不必重构。

标签: c++ pointers smart-pointers


【解决方案1】:

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

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

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

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

还有更多方法可以避免指针。特别是,shared_ptr 实际上只需要在您真正需要传递所有权 时才需要说明。在不处理所有权的函数中,您不会传递shared_ptr 或原始指针;您将传递一个引用,并在调用函数时取消引用指针。

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

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

【讨论】:

    【解决方案2】:

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

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

    我在某处听说最常用的智能指针是 unique_ptr。在我的申请中当然不是这样。我最终会更频繁地使用 shared_ptr mush。那么这是否是糟糕设计的标志?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多