繁体   English   中英

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

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

我试图了解何时需要分配一个对象数组,每个指针都指向某个对象,例如指向 Student 的 Student 数组:

Student** db = new Student*[size]

我什么时候需要使用它? 我知道这是一个普遍的问题,但我正在尝试解决一些结合继承的考试,并且在某些类中,他们如上所述声明了其中一个数据成员。 在我的解决方案中,我写道:

Student * db = new Student[size];

谢谢。

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

TL;DR 版本:

使用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::vectorstd::unique_ptr是 RAII 的绝佳例子。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM