Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;动态指针数组-何时需要使用?_C++ - Fatal编程技术网

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]