[英]c++ dynamic array of pointers - when i need to use it?
我试图了解何时需要分配一个对象数组,每个指针都指向某个对象,例如指向 Student 的 Student 数组:
Student** db = new Student*[size]
我什么时候需要使用它? 我知道这是一个普遍的问题,但我正在尝试解决一些结合继承的考试,并且在某些类中,他们如上所述声明了其中一个数据成员。 在我的解决方案中,我写道:
Student * db = new Student[size];
谢谢。
假设您已经有一个集合,例如一个按学生 ID 排序的学生链接列表。 您想按学生姓氏对它们进行排序。 而不是改变你的链表,或者弄乱它的顺序,你只需分配一个指针数组并对其进行排序。 您的原始列表保持不变,但您可以使用数组按姓氏进行快速二进制搜索。
使用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++ 中最难做到的事情之一,管理内存管理的最佳方法之一是通过Resource Allocation Is Initialization 或 RAII 。 std::vector
和std::unique_ptr
是 RAII 的绝佳例子。
vector
是一个动态数组,所有这些都很好地封装在一个类中,该类处理列表管理的几乎所有方面,包括添加、删除、调整大小以及确保所有内容都得到清理。 unique_ptr
是一个智能指针,它确保资源只有一个所有者,当资源被销毁时,这个所有者将清理资源。 结果, std::vector<std::unique_ptr<Student>>
将允许您添加、删除、访问和移动任何Student
而无需任何直接干预。 这使您可以编写更简单的代码。 更简单的代码不太可能出现错误。 更少的错误意味着更多的闲暇时间和更快乐的客户。 每个人都赢了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.