我正忙于设计一个新的 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_ptr
或 auto_ptr
).
shared_ptr
是您无法保证对象的生命周期或所有权时可能会回退的内容。但是当你使用它时,你还需要使用 weak_ptr
来打破循环。
确实,更好的方法是尽可能避免指针。当您确实需要一个指针时,使用一个可能具有最具体所有权语义的指针(首选 scoped_ptr
,它根本不允许所有权转移,然后如果您需要它,回退到允许您移动所有权的方法,例如unique_ptr
,只有作为最后的手段,您才应该使用shared_ptr
,它允许您在任意数量的客户之间自由共享所有权。
没有任何魔杖可以让您的 C++ 代码“正常工作”。实现这一目标的唯一方法是编写良好可靠的 C++ 代码。你通过了解和使用你可以使用的工具来做到这一点,而不是假装“嘿,shared_ptr
就像一个垃圾收集器,不是吗?我可以忽略所有问题如果我使用它,对象生命周期或内存泄漏”。
关于c++ - 在 C++ 中更轻松地使用共享指针的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4497504/