我可以制作指向智能指针的智能指针吗?
Can I make a smart pointer to a smart pointer?
我是C++(和堆栈溢出!(的新手,所以如果这个问题已经以某种方式得到回答,我深表歉意,我只是无法准确找到我正在寻找的东西。
在最近的一个项目中,我创建了指向指针的指针(例如:Tiger **tigerArray;(,结果我的程序中出现了内存泄漏,但我始终无法弄清楚原因。我有一个想法,也许如果我做了聪明的指针而不仅仅是指针,那可能会解决问题?
所以我很好奇,如果我能创建一个指向指针的指针,我可以创建一个指向智能指针的智能指针吗?
**对不起,我应该更新,我不允许在此作业中使用向量,我们必须使用数组
智能点是通用的;你基本上可以将任何你想要的东西贴在一个里面。但是你应该根据你想要实现的目标来决定适合工作的工具。智能指针具有相当具体的用例。另一方面,指向指针的指针有几个不同的用例:
指针数组的指针数组,用于实现 2D 数组。如果这是您要实现的目标,请考虑使用
std::vector<std::vector<T>>
或std::array<std::array<T, N>, M>
如果您知道您的数组将始终具有M
xN
的大小。指向指针的指针,用于修改函数中的另一个指针。在这种情况下,应考虑通过引用传递。如果你在代码中确实需要指针,你可以通过传递
T*&
来修改一个指针,一个指向T
的指针的引用。但是,根据您所表示的内容,您也可以将数据传递为std::vector<T>&
,例如。
智能指针的存在是为了自动管理对象的生存期,具体取决于您希望如何使用这些对象。它们并非纯粹作为一种间接方式而存在,这种方式对许多不同的用法(如原始指针(开放。我对使用哪种工具的建议如下:
- 如果您需要一个简单的可调整大小的
T
数组,请使用std::vector<T>
。 - 如果您需要 2D 可调整大小的
T
数组,请使用std::vector<std::vector<T>>
。 - 如果您知道数组中将始终有
N
元素,请考虑使用std::array<T, N>
。 - 如果你需要更多的结构,比如严格的排序或关系,考虑使用
std::set
、std::map
、std::multimap
、std::queue
、std::stack
等
。
关于智能指针:
- 如果您需要一个轻量级的对象来传递,但只有一个所有者,或者如果您需要封装在单个位置使用的多态对象,请考虑
std::unique_ptr<T>
- 如果您需要一个对象由代码中的多个位置使用,而该位置没有一个合理的所有权位置,而是需要具有分布式所有权,请使用
std::shared_ptr<T>
- 如果要从函数内部修改对象,使对象在函数需要的持续时间内生存,只需通过引用传递:
T&
- 如果要读取但不修改函数中的对象,在该对象在函数需要期间处于活动状态,请通过引用传递给 const:
const T&
编辑:
在看到您不允许将std::vector
用于作业后,我意识到我并没有真正回答您的更新问题。但我仍然希望给你(和未来的读者(一些关于智能指针的用途和不适用目的的见解。
如果你的导师教C++但不允许你使用vector
,我会批评他们说vector
是现代C++开发人员腰带上非常重要的工具,它的使用比 C 风格的替代方案更简单、更安全,这些替代方案仍然被教授为在许多过时的课程中C++。其他工具和技术也是如此,例如通常避免指针,避免new
和delete
,以及充分利用标准库的容器和算法,所有这些都可以帮助您编写更干净,更正和高效的代码。
- 1d 智能指针不适用于语法 (*)++
- 优先顺序:智能指针和类析构函数
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 智能指针作为无序映射键,并通过引用进行比较
- 智能指针概念所有权和寿命
- 正在理解智能指针,但出现错误:未分配正在释放的指针
- 尝试使用智能指针时引发异常
- 我可以制作指向智能指针的智能指针吗?
- 通过智能指针和转换对基本模板参数进行模板推导
- OpenCV 我应该使用智能指针来防止内存泄漏吗?
- 从堆栈分配的原始指针构造智能指针
- 初始化指向类实例的智能指针并访问其方法
- 如何使用 std::make_shared 创建基类类型的智能指针?
- 给定一个指向堆分配内存的指针,智能指针实现如何为其找到合适的释放函数?
- 编译器不会使用 -std=c++11 编译智能指针
- 具有智能指针的多态性
- C++:矢量分配器行为、内存分配和智能指针
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 指向函数签名中的常量智能指针
- 使用智能指针附加的继承对象的深层复制