C++ c++;动态指针数组-何时需要使用?
我试图理解当我需要分配一个对象数组时,每个指向某个对象的指针,例如指向学生的学生数组:C++ c++;动态指针数组-何时需要使用?,c++,C++,我试图理解当我需要分配一个对象数组时,每个指向某个对象的指针,例如指向学生的学生数组: Student** db = new Student*[size] 我什么时候需要使用它?我知道这是一个一般性的问题,但我正在尝试解决一些结合继承的考试,在一些类中,他们声明了一个数据成员,正如我前面所说的。 在我的解决方案中,我写道: Student * db = new Student[size]; 谢谢。假设您已经有了一个集合,例如一个按学生ID排序的学生链表。您想按学生姓氏排序。您只需分配一个指针
Student** db = new Student*[size]
我什么时候需要使用它?我知道这是一个一般性的问题,但我正在尝试解决一些结合继承的考试,在一些类中,他们声明了一个数据成员,正如我前面所说的。
在我的解决方案中,我写道:
Student * db = new Student[size];
谢谢。假设您已经有了一个集合,例如一个按学生ID排序的学生链表。您想按学生姓氏排序。您只需分配一个指针数组并对其进行排序,而无需更改链接列表或打乱其顺序。原始列表保持不变,但可以使用数组按姓氏进行快速二进制搜索。TL;DR版本: 使用
std::vector db
解释
可用于表示从Student
派生的类数组
例如:
Student**db=新学生*[size];
db[0]=新毕业生();
db[1]=新的合作大学学生();
db[2]=新的小学生();
如果你选择第二个选项
Student*db=新学生[size];
db[0]=研究生();
db[1]=合作大学学生();
db[2]=小学生();
直接按住Student
而不是指向Student
s的指针,可以节省大量烦人的手动内存管理,但会将派生的Student
s转换为普通的Student
s。适合学生的大小和形状的盒子只能存储学生
,因此分配给db[0]
的毕业生
的所有附加功能都将丢失。只有通过存储对研究生
的引用,才能保留研究生
的扩展名。您只需记住,研究生
实际上存储在其他地方
听起来不错吧?在查看所有动态分配之前,您必须确保已清理。内存管理是C++中最难掌握的事情之一,而通过内存管理来管理内存管理的最佳方法之一就是通过.std::vector
和std::unique_ptr
是RAII的绝佳例子
vector
是一个动态数组,所有数组都很好地封装在一个类中,该类几乎可以处理列表管理的每个方面,包括添加、删除、调整大小,并确保所有内容都得到清理unique_ptr
是一个确保资源中只有一个的属性,当资源被销毁时,该所有者将清理该资源。结果,std::vector
将允许您添加、删除、访问和移动任何Student
s,而无需任何直接干预。这允许您编写更简单的代码。简单的代码不太可能有bug。更少的bug意味着更多的闲暇时间和更快乐的客户。人人都赢
Student** db = new Student*[size]