C++ C++;无STL的动态数组
这是作业的一部分,但我只是要求澄清: 从ATM.txt加载数据并将其存储在动态数组中(ATM类型, 当程序启动时,不是STL 在没有STL的情况下,如何准确地创建动态数组?我想也许这个作业意味着使用指针,“自动取款机类型”把我甩了 再次提到: 将accounts.txt文件放入动态数组(帐户类型,而不是STL) --不是任务的一部分 我从未理解过使用内存不安全操作,例如从第一行提取文件中的项目数: 例如C++ C++;无STL的动态数组,c++,arrays,C++,Arrays,这是作业的一部分,但我只是要求澄清: 从ATM.txt加载数据并将其存储在动态数组中(ATM类型, 当程序启动时,不是STL 在没有STL的情况下,如何准确地创建动态数组?我想也许这个作业意味着使用指针,“自动取款机类型”把我甩了 再次提到: 将accounts.txt文件放入动态数组(帐户类型,而不是STL) --不是任务的一部分 我从未理解过使用内存不安全操作,例如从第一行提取文件中的项目数: 例如 使用STL(vectors,或C++11数组)而不依赖文件中的数字不是更明智吗,因为它可能不
使用STL(vectors,或C++11数组)而不依赖文件中的数字不是更明智吗,因为它可能不准确,从而导致缓冲区溢出等 //编辑 在Account.h文件中定义一个类帐户,该文件包含以下数据成员:customer id、BSB编号等
我假设Account和ATM类型就是这些类。这种分配的常见方法是自己模拟向量的自动扩展行为。为堆上的数据分配一个数组,并跟踪其长度和存储在数组中的项数
用数据填充数组后,将最大大小扩大一部分,然后分配一个新数组。这允许您将数据从旧数组复制到新数组中,然后继续添加项,直到空间再次耗尽。基本上,如果需要在不使用STL的情况下实现动态数组,则必须明确处理内存分配/释放 基本上,你必须:
- 第一次构造或使用数组时使用malloc分配空间
- 跟踪插入/删除的元素
- 完成分配的空间后使用realloc
- 销毁阵列时释放分配的空间
- 尽可能避免重新分配。当空间完成时,分配更多的空间以避免继续调用realloc(请参阅std::vector::reserve)
- 移除元素时,避免重新锁定空间。一旦分配完,除非内存使用率太高,否则就让分配的空间保持原样,以避免将来重新分配
使用STL(向量或C++11数组)而不是 依赖文件中的数字,因为它可能不准确 缓冲区溢出等 std::vector的内部结构并不神奇。可以像std::vector为您所做的那样手动执行
听起来这就是你在这项任务中应该做的;制作您自己的“ATM类型”,可以管理从ATM.txt文件安全读取数据,以及可以保存accounts.txt文件数据的“帐户类型”。你可能会从写作业的人那里得到一些关于他们期望如何设计/使用这些类型的澄清。回顾一下你所掌握的任何课程材料,你都应该知道使用动态数组需要知道什么。动态数组最基本的形式是使用
new[]
创建,然后使用delete[]
销毁:
ATM * atms = new ATM[count];
// do stuff with the array
delete [] atms;
但是,这带来了使用数组的代码可能引发异常、从函数返回或以其他方式阻止delete[]
发生的危险。如果发生这种情况,那么您将丢失指向已分配内存的唯一指针,它将保持已分配但无法访问;这称为内存泄漏。因此,最好将数组封装在类中,并使用:
- 成员变量来存储指向数组的指针,以及(可选)其大小
- 用于分配数组的构造函数和/或函数
- 用于删除数组的析构函数
- (可选)用于调整阵列大小的函数
使用STL不是更聪明吗
通常是的。但是如果你正在学习C++,那么理解内存管理是如何工作的,以及如何让库处理你的内存是一个好主意。这可能是本练习的一部分内容。由于这是家庭作业,我们不想直接给出答案,但总体而言,我建议:
ATM * atms = new ATM[count];
// do stuff with the array
delete [] atms;