我可以制作指向智能指针的智能指针吗?

Can I make a smart pointer to a smart pointer?

本文关键字:智能 指针 我可以      更新时间:2023-10-16

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

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

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

**对不起,我应该更新,我不允许在此作业中使用向量,我们必须使用数组

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

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

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

智能指针的存在是为了自动管理对象的生存期,具体取决于您希望如何使用这些对象。它们并非纯粹作为一种间接方式而存在,这种方式对许多不同的用法(如原始指针(开放。我对使用哪种工具的建议如下:

  • 如果您需要一个简单的可调整大小的T数组,请使用std::vector<T>
  • 如果您需要 2D 可调整大小的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++但不允许你使用vector,我会批评他们说vector是现代C++开发人员腰带上非常重要的工具,它的使用比 C 风格的替代方案更简单、更安全,这些替代方案仍然被教授为在许多过时的课程中C++。其他工具和技术也是如此,例如通常避免指针,避免newdelete,以及充分利用标准库的容器和算法,所有这些都可以帮助您编写更干净,更正和高效的代码。