在 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 函数调整数组大小可能是造成这种情况的原因` 好吧调试它并确认是这种情况!第一个明显的问题:doubleSizeoldAmount 参数是否应该是参考?如果没有,则将其设置在最后一行不会执行任何操作。 (maxElements 同上。我认为必须是参考,oldAmount 不是那么重要。 @John3136 我试过调试它,但我还是调试新手,所以很遗憾我找不到导致崩溃的原因。 你可以通过打印出值来调试,看看你的程序能走多远以及它在不同点的状态是什么。 代码不正确。您必须将数组声明为 Airport ** items 【参考方案1】:

在对 counter == maxelements 的数组进行赋值之前,不要将大小加倍,但 items[maxelements] 无效 - 只有 maxelements - 1

如果你将 doublesize 移到作业之上,事情应该会更好。

另外,没有理由检查total &gt; 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++ 中动态调整数组的大小的主要内容,如果未能解决你的问题,请参考以下文章

glibc 附带的 C 是不是有自动调整大小的数组/动态数组实现?

为啥我的动态数组可以在不调整大小的情况下工作? [复制]

如何调整类中动态分配的数组的大小?

使用向量类实现堆栈的链表与动态数组

调整c++数组的大小和复制

如何调整动态分配的多态对象数组的大小?