在 C++ 中动态调整数组的大小
Posted
技术标签:
【中文标题】在 C++ 中动态调整数组的大小【英文标题】:Dynamic resizing of an array in C++ 【发布时间】:2016-04-10 23:58:10 【问题描述】:我有一个指向 Airport 对象的类。动态数组的大小从 10 开始。当total
大于数组的大小并且我已读入数据以填充数组时,我需要将数组的大小加倍,从旧数组放入新大小的数组,然后删除旧数组。该数组将继续读入数据,然后调整大小,并继续此操作,直到文件中的所有数据都读入items
数组。
没有发生错误,但问题是当我运行程序时,它崩溃了。我认为我的doubleSize
调整数组大小的函数可能是造成这种情况的原因。有没有办法解决这个问题?
class AirportList
private:
Airport* items;
int total;
int maxElements;
int oldAmount;
public:
AirportList()
oldAmount = 10;
maxElements = 10;
items = new Aiport[maxElements];
// a file was opened to read in data before this,
// total equals the total amount of lines in the file
string cppstr;
for (int counter = 0; counter < total; counter++)
getline(infile, cppstr);
items[counter] = Airport(cppstr); // the Airport constructor
// parses each line to read in
// the data and sets each Airport
// object into the items array
if (total > maxElements && counter == maxElements)
doubleSize(items, maxElements, oldAmount);
infile.close();
void doubleSize(Airport*& orig, int maxElements, int oldAmount)
maxElements = maxElements * 2;
Aiport* resized = new Aiport[maxElements];
for (int i = 0; i < oldAmount; i++)
resized[i] = orig[i];
delete [] orig;
orig = resized;
oldAmount = maxElements;
;
【问题讨论】:
` 我认为我的 doubleSize 函数调整数组大小可能是造成这种情况的原因` 好吧调试它并确认是这种情况!第一个明显的问题:doubleSize
的 oldAmount
参数是否应该是参考?如果没有,则将其设置在最后一行不会执行任何操作。 (maxElements
同上。我认为必须是参考,oldAmount
不是那么重要。
@John3136 我试过调试它,但我还是调试新手,所以很遗憾我找不到导致崩溃的原因。
你可以通过打印出值来调试,看看你的程序能走多远以及它在不同点的状态是什么。
代码不正确。您必须将数组声明为 Airport ** items
【参考方案1】:
在对 counter == maxelements
的数组进行赋值之前,不要将大小加倍,但 items[maxelements]
无效 - 只有 maxelements - 1
。
如果你将 doublesize 移到作业之上,事情应该会更好。
另外,没有理由检查total > maxElements
。根本没有必要。
【讨论】:
doubleSize(items, maxElements, oldAmount); if (counter == maxElements - 1) doubleSize(items, maxElements, oldAmount);
这就是你把它移到作业上方的意思吗?
@Mark 当 current==maxsize 时,您永远不能分配给 items[current] - 请记住数组从 0 开始,因此 size=3 数组在 0、1 和 2 处具有有效元素。您在进行该分配之前需要增加大小。因此,只需将 if 块移动到分配上方。 readline then if(current==maxsize)... then items[current]=...
我现在明白了。如上所示,AirportList
类没有复制构造函数、析构函数和重载的 = 运算符。您认为这也可能导致崩溃吗?
取决于您是否正在制作它的副本——如果是,您将如何处理它们。当项目被销毁时,可能应该在项目上调用 delete[] ,但这不会导致崩溃,只会导致内存泄漏。一般来说,如果你动态分配内存,你应该有一个析构函数和一个自定义复制构造函数(或者使用“= delete;”选项显式删除它)
我已经修改为if (counter == maxElements - 1) double the size
。然后 readline 然后items[counter] = Airport(cppstr);
。但是,它仍然崩溃。难道我还是误会了你吗?【参考方案2】:
我怀疑您对 Airport 类的复制构造函数有错误。您需要为 Airport 定义一个复制构造函数(它对其数据进行深度复制)并重载赋值运算符以使用新的复制构造函数。否则,当您执行resized[i] = orig[i];
时,您将执行一个浅拷贝,最终仍指向原始(现已删除)机场对象中的数据。
看这里:http://www.cplusplus.com/articles/y8hv0pDG/
【讨论】:
你不认为这与在 counter == maxelements 时对 items[counter] 的赋值有关吗? 我的 Airport 类没有复制构造函数,因为我在该类中没有动态内存。我还需要复制构造函数吗? @xaxxon 错过了——是的,当 counter == maxelements 时,您肯定需要在调用 items[counter] 之前调整大小!以上是关于在 C++ 中动态调整数组的大小的主要内容,如果未能解决你的问题,请参考以下文章