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

时间:2018-10-22 19:08:35

标签: c++ pointers smart-pointers

我是C ++的新手(和Stack Overflow!),所以我很抱歉如果这个问题已经得到一定程度的解答,我只是无法准确找到我想要的东西。

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

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

**抱歉,我应该更新,不允许我使用向量进行此分配,我们必须使用数组

1 个答案:

答案 0 :(得分:0)

智能积分是通用的;您基本上可以将任何东西贴在里面。但是,您应该根据要实现的目标来选择合适的工具。智能指针具有相当特定的用例。另一方面,指向指针的指针有几种不同的用例:

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

    < / li> 指向指针的
  • 指针,用于修改函数中的另一个指针。在这种情况下,您应该考虑通过引用传递。如果您的代码中确实需要指针,则可以通过传递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等< / li>

关于智能指针:

  • 如果您需要一个重量轻的对象来回走,但只有一个所有者,或者需要封装一个用于单个位置的多态对象,请考虑std::unique_ptr<T>
  • 如果您需要一个对象在代码中的多个位置使用,而该对象没有一个合理的所有权位置,而是需要具有分布式所有权,请使用std::shared_ptr<T>
  • 如果您要从函数内部修改对象,以使该对象在函数需要的时间内存在,请通过引用传递:T&
  • 如果您要读取但不修改某个函数中的某个对象,而该对象在该函数的需要期间仍处于活动状态,请引用const:const T&

编辑:

在看到您不允许使用std::vector进行分配后,我意识到我并没有真正回答您的最新问题。但是我仍然希望为您(和将来的读者)提供一些关于什么是智能指针以及什么不是智能指针的见识。

如果您的讲师在教C ++但不允许您使用vector,我会批评他们,说vector是现代C ++开发人员及其工具上极为重要的工具比许多在过时的课程中仍被讲成C ++的C风格替代方法更简单,更安全。其他工具和技术也一样,例如通常避免使用指针,避免使用newdelete,并充分利用标准库的容器和算法,所有这些都可以帮助您编写更整洁,更正,高效的代码。