指针的 C++ 动态数组 - 何时需要使用它?
c++ dynamic array of pointers - when i need to use it?
我试图理解何时需要分配一个对象的数组,每个对象指向某个对象,例如指向学生的学生数组:
Student** db = new Student*[size]
我什么时候需要使用它?我知道这是一个普遍的问题,但我正在尝试解决一些结合继承的考试,并且在某个类中,他们声明的数据成员之一,如我上面所说。 在我的解决方案中,我写道:
Student * db = new Student[size];
谢谢。
TL;容灾版本:
使用std::vector<std::unique_ptr<Student>> db
.
解释
Student** db = new Student*[size]
可用于表示派生自Student
的类数组。
例如:
Student** db = new Student*[size];
db[0] = new Grad_Student();
db[1] = new Coop_Student();
db[2] = new Elementary_Student();
如果您选择第二个选项
Student * db = new Student[size];
db[0] = Grad_Student();
db[1] = Coop_Student();
db[2] = Elementary_Student();
通过直接持有Students
而不是指向Student
的指针,您可以节省大量烦人的手动内存管理,但是对象切片会将派生的Student
变成普通的旧Student
。一个大小和形状适合Student
的盒子只能存储一个Student
,所以所有附加功能,例如分配给db[0]
的Grad_Student
都将丢失。只有存储对Grad_Student
的引用,才能保留Grad_Student
的扩展名。您只需要记住,Grad_Student
实际上存储在其他地方。
听起来不错吧?直到您查看所有动态分配,您才必须确保已清理。 内存管理是C++中最难做到的事情之一,管理内存管理的最佳方法之一是通过资源分配初始化或 RAII。std::vector
和std::unique_ptr
是RAII在行动中的极好例子。
vector
是一个动态数组,全部很好地包装在一个类中,该类几乎可以处理列表管理的各个方面,包括添加、删除、调整大小并确保所有内容都得到清理。unique_ptr
是一个智能指针,可确保资源只有一个所有者,并且该所有者将在资源被销毁时清理资源。结果,std::vector<std::unique_ptr<Student>>
将允许您添加、删除、访问和移动任何Student
,而无需任何直接干预。这允许您编写更简单的代码。更简单的代码不太可能出现错误。更少的错误意味着更多的闲暇时间和更快乐的客户。每个人都是赢家。
假设您已经有一个集合,例如按学生ID排序的学生链表。 您希望按学生姓氏对它们进行排序。 无需更改链表或弄乱其顺序,只需分配一个指针数组并对其进行排序即可。 您的原始列表保持不变,但您可以使用数组按姓氏进行快速二进制搜索。
- 何时在引用或唯一指针上使用移动语义
- cmake在我的项目中所需的所有静态库都不成功
- 何时提供默认参数作为模板参数
- C++-明确何时以及如何调用析构函数
- 当我尝试使用 sstream 和分面将 Boost Time_duration转换为字符串时,我没有得到所需的格式
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 按需渲染帧
- 函数如何使用引用返回所需的数字?
- 如果非动态变量被指针引用,何时超出范围?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- 何时定义QT_NO_CONTEXTMENU?
- 何时为派生类初始化 vptr?
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 指针的 C++ 动态数组 - 何时需要使用它?
- 我应该在 C++ 中何时/为什么使用 STATIC?
- 确定将弧转换为线段所需的点数
- 不理解为什么代码没有产生所需的答案