指针的 C++ 动态数组 - 何时需要使用它?

c++ dynamic array of pointers - when i need to use it?

本文关键字:何时需 C++ 动态 数组 指针      更新时间:2023-10-16

我试图理解何时需要分配一个对象的数组,每个对象指向某个对象,例如指向学生的学生数组:

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::vectorstd::unique_ptr是RAII在行动中的极好例子。

vector是一个动态数组,全部很好地包装在一个类中,该类几乎可以处理列表管理的各个方面,包括添加、删除、调整大小并确保所有内容都得到清理。unique_ptr是一个智能指针,可确保资源只有一个所有者,并且该所有者将在资源被销毁时清理资源。结果,std::vector<std::unique_ptr<Student>>将允许您添加、删除、访问和移动任何Student,而无需任何直接干预。这允许您编写更简单的代码。更简单的代码不太可能出现错误。更少的错误意味着更多的闲暇时间和更快乐的客户。每个人都是赢家。

假设您已经有一个集合,例如按学生ID排序的学生链表。 您希望按学生姓氏对它们进行排序。 无需更改链表或弄乱其顺序,只需分配一个指针数组并对其进行排序即可。 您的原始列表保持不变,但您可以使用数组按姓氏进行快速二进制搜索。