如何使用C++中的共享指针更容易

Pat*_*ick 1 c++ visual-studio-2010 shared-ptr c++11

我正忙着设计一个新的C++应用程序.在这个应用程序中,我想用指针最小化潜在的错误,并且由于应用程序应该是普通的C++(没有.Net或其他奇特的东西),我正在调查共享指针,我正在考虑在任何地方使用共享指针(而不是普通的指针).

我制定了一些技巧,以便更容易使用共享指针,例如:在类中使用typedef,如下所示:

class X
   {
   public:
      ...
      typedef std::shared_ptr<X> Ptr;
   };
Run Code Online (Sandbox Code Playgroud)

这样你就可以轻松编写X :: Ptr,它比"std :: shared_ptr"更容易编写.

我还注意到共享指针的一些缺点:

  • 无处不在我使用我需要包含的共享指针 <memory>
  • 如果我只想使用指针,我就不能再使用前向声明了

还有其他技巧可以让共享指针更容易使用吗?

jal*_*alf 8

别!

最小化指针错误的唯一方法是使用正确的指针类型.这是类型,复数.

共享指针不是灵丹妙药.当你有周期性参考时,它们会立即变成内存泄漏(如果计划在任何地方使用它们,那些会很快出现)

如果你想要没有错误的C++应用程序,你必须为它工作.你必须了解你的申请.您必须了解不同对象的所有权语义.共享指针只为您提供共享所有权,这通常是一个不错的最低分母.其他所有东西都可以被共享所有权取代,它会起作用.

但是默认情况下是一个对象是由拥有一个其他实体.它由函数拥有,并且应该在该函数返回时被销毁,或者它由类或其他任何东西拥有.通常,你根本不需要指针.std::vector或许,对象按值存储在a中.或者它只是一个局部变量或类成员.如果它一个指针,它通常会更好地由一个scoped_ptr允许所有权转移(unique_ptrauto_ptr)的一个或多个表示.

shared_ptr当你无法保证对象的生命周期或所有权时,你可能会回到这一点.但是当你使用它时,你还需要weak_ptr用来打破周期.

实际上,更好的方法是尽可能避免指针.当你这样做需要一个指针,使用一个具有最具体的所有权语义的可能(喜欢scoped_ptr,不允许过户的话,那么如果你需要它,回落到一个允许您移动所有权,如unique_ptr,并且只作为最后的手段,您可以使用shared_ptr,这允许您在任意数量的客户之间自由分享所有权.

没有魔杖可以让你的C++代码"正常工作".实现这一目标的唯一方法是编写良好的可靠C++代码.你可以通过了解和使用你可以使用的工具来做到这一点,而不是假装"嘿,shared_ptr就像垃圾收集器一样,不是吗?我可以忽略对象生命周期或内存泄漏的所有问题,如果我使用的话它".