我可以让智能指针指向智能指针吗?

Can I make a smart pointer to a smart pointer?

我是 C++(和 Stack Overflow!)的新手,所以如果这个问题已经以某种方式得到回答,我深表歉意,我只是无法找到我正在寻找的东西。

在最近的一个项目中,我创建了指向指针的指针(例如:Tiger **tigerArray;),结果在我的程序中出现内存泄漏,但我始终无法弄清楚原因。我有一个想法,也许如果我做了智能指针而不只是指针,那可能就解决了问题?

所以我很好奇,如果我可以创建一个指向指针的指针,我是否可以创建一个指向智能指针的智能指针?

**抱歉我应该更新,我不允许在这个作业中使用向量,我们不得不使用数组

智能点是通用的;你基本上可以把任何你想要的东西粘在里面。但是您应该根据您要实现的目标来决定适合该工作的工具。智能指针有相当具体的用例。另一方面,指向指针的指针有几个不同的用例:

  • 指针数组的指针数组,用于实现二维数组。如果这是您要实现的目标,请考虑使用 std::vector<std::vector<T>>std::array<std::array<T, N>, M> 如果您知道数组的大小始终为 MxN.

  • 指向一个指针的指针,用于修改函数中的另一个指针。在这种情况下,您应该考虑通过引用传递。如果您的代码中确实需要指针,您可以通过传递为 T*& 来修改一个指针,这是对指向 T 的指针的引用。但是根据您所代表的内容,您也可以将数据传递为 std::vector<T>&,例如。

存在智能指针,可以根据您希望如何使用这些对象来自动管理对象的生命周期。它们并不纯粹作为一种对许多不同用途开放的间接方式而存在,例如原始指针。我对使用哪种工具的建议如下:

  • 如果您需要一个简单的可调整大小的 T 数组,请使用 std::vector<T>
  • 如果您需要 T 的可调整大小的二维数组,请使用 std::vector<std::vector<T>>
  • 如果您知道您的数组中将始终有 N 个元素,请考虑使用 std::array<T, N>
  • 如果您需要更多结构,例如严格的顺序或关系,请考虑使用 std::setstd::mapstd::multimapstd::queuestd::stack,等等

关于智能指针:

  • 如果您需要一个轻量级的对象来传递但只有一个所有者,或者如果您需要封装一个在单个地方使用的多态对象,请考虑 std::unique_ptr<T>
  • 如果您需要一个对象被代码中的多个位置使用,而代码中没有一个合理的所有权位置,而是需要分布式所有权,请使用 std::shared_ptr<T>
  • 如果您想从函数内部修改一个对象,以便该对象在函数需要的时间内存在,只需通过引用传递:T&
  • 如果您想要读取但不修改函数中的对象,并且该对象在函数需要的持续时间内仍然存在,请通过引用传递给 const:const T&

编辑:

在看到您不允许使用 std::vector 进行作业后,我意识到我并没有真正回答您更新后的问题。但我仍然希望能让您(和未来的读者)了解智能指针的用途和用途。

如果您的讲师正在教授 C++ 但不允许您使用 vectors,我会批评他们说 vector 是现代 C++ 开发人员腰带上的一个非常重要的工具,并且它的用法比在许多过时的课程中仍然作为 C++ 教授的 C 风格替代品要简单和安全得多。其他工具和技术也是如此,比如一般避免指针,避免newdelete,以及善用标准库的容器和算法,所有这些都可以帮助你写得更干净、更正确、高效的代码。