我是C ++的新手(和Stack Overflow!),所以我很抱歉如果这个问题已经得到一定程度的解答,我只是无法准确找到我想要的东西。
在最近的项目中,我创建了指向指针的指针(例如:Tiger ** tigerArray;),并最终在程序中出现内存泄漏,但我始终无法弄清原因。我曾想过,如果我做的不仅仅是智能指针,那也许可以解决问题?
所以我很好奇,如果我可以创建一个指向指针的指针,我可以创建一个指向智能指针的智能指针吗?
**抱歉,我应该更新,不允许我使用向量进行此分配,我们必须使用数组
答案 0 :(得分:0)
智能积分是通用的;您基本上可以将任何东西贴在里面。但是,您应该根据要实现的目标来选择合适的工具。智能指针具有相当特定的用例。另一方面,指向指针的指针有几种不同的用例:
指针数组,用于实现2D数组。如果这是您要实现的目标,请考虑使用std::vector<std::vector<T>>
或std::array<std::array<T, N>, M>
,如果您知道数组大小始终为M
x N
。
指针,用于修改函数中的另一个指针。在这种情况下,您应该考虑通过引用传递。如果您的代码中确实需要指针,则可以通过传递T*&
(指向T
的指针的引用)来修改指针。但是根据您要表示的内容,您可以像传递std::vector<T>&
一样传递数据。
存在智能指针可以自动管理对象的生存期,具体取决于您希望这些对象的使用方式。它们不纯粹是作为一种间接方式存在的,可以对许多不同的用法开放,例如原始指针。我对使用哪种工具的建议如下:
T
的可调整大小的简单数组,请使用std::vector<T>
。T
的二维可调整大小的数组,请使用std::vector<std::vector<T>>
。N
个元素,请考虑使用std::array<T, N>
。std::set
,std::map
,std::multimap
,std::queue
,std::stack
等< / li>
关于智能指针:
std::unique_ptr<T>
std::shared_ptr<T>
T&
const T&
编辑:
在看到您不允许使用std::vector
进行分配后,我意识到我并没有真正回答您的最新问题。但是我仍然希望为您(和将来的读者)提供一些关于什么是智能指针以及什么不是智能指针的见识。
如果您的讲师在教C ++但不允许您使用vector
,我会批评他们,说vector
是现代C ++开发人员及其工具上极为重要的工具比许多在过时的课程中仍被讲成C ++的C风格替代方法更简单,更安全。其他工具和技术也一样,例如通常避免使用指针,避免使用new
和delete
,并充分利用标准库的容器和算法,所有这些都可以帮助您编写更整洁,更正,高效的代码。