c++ - 在 C++ 中更轻松地使用共享指针的方法

标签 c++ visual-studio-2010 c++11 shared-ptr

我正忙于设计一个新的 C++ 应用程序。在这个应用程序中,我想尽量减少指针的潜在错误,并且由于应用程序应该是纯 C++(没有 .Net 或其他花哨的东西),我正在研究共享指针,并且我正在考虑在任何地方使用共享指针(而不是普通指针)。

我想出一些技巧来简化共享指针的使用,例如:在类中使用 typedef,如下所示:

class X
   {
   public:
      ...
      typedef std::shared_ptr<X> Ptr;
   };

这样你就可以很容易地写 X::Ptr,这比到处都是“std::shared_ptr”更容易写。

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

  • 我在所有使用共享指针的地方都需要包含 <memory>
  • 如果我只想使用指针,我不能再使用前向声明

是否有任何其他技巧可以使共享指针更易于使用?

最佳答案

不要!

减少指针错误的唯一方法是使用正确的指针类型。那是类型,复数形式。

共享指针不是 Elixir 。当你有循环引用时,它们就会成为内存泄漏(如果计划到处使用它们,它们会很快出现)

如果您想要无错误的 C++ 应用程序,您必须为此努力。您必须了解您的应用程序。您必须了解不同对象的所有权语义。共享指针只是给你共享所有权,这通常是一个不错的最低分母。其他一切都可以被共享所有权所取代,并且它会起作用,某种程度上。

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

shared_ptr 是您无法保证对象的生命周期或所有权时可能会回退的内容。但是当你使用它时,你还需要使用 weak_ptr 来打破循环。

确实,更好的方法是尽可能避免指针。当您确实需要一个指针时,使用一个可能具有最具体所有权语义的指针(首选 scoped_ptr,它根本不允许所有权转移,然后如果您需要它,回退到允许您移动所有权的方法,例如unique_ptr,只有作为最后的手段,您才应该使用shared_ptr,它允许您在任意数量的客户之间自由共享所有权。

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

关于c++ - 在 C++ 中更轻松地使用共享指针的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4497504/

相关文章:

c++ - Unique_ptr 自动销毁魔法

c++ - 如何使用写时复制来最小化 c++ 程序的内存消耗?

python - 如何使用 SWIG 将 C++ 数组转换为 Python 列表?

c++ - 使 Sublime Text 在 Mac 上使用 gcc4.8

c++ - 在vs2010中使用iostream时,出现错误C2039 : 'exit' : is not a member of '` global namespace''

c++ - Visual Studio 调试器错误 : Unable to start program Specified file cannot be found

c++ - 多重继承指定所需的虚函数而不重新定义它

c++ - Windows QueueUserWorkItem C++ Release模式问题

c++ - 从 C++ DLL 到 Matlab 的解析时间

visual-studio - 有没有一种方法可以防止Visual Studio 2010在ASP.NET MVC View 中格式化C#代码?