C ++部分填充动态数组

时间:2016-05-22 21:19:07

标签: c++ arrays pointers memory

所以我有一个部分填充的数组,有一组函数要为它写。

基本上,数组就像这样。一个整数被添加到下一个可用空闲空间中,当达到容量时,数组加倍并且大小,并且所有元素都被添加到新的空间中。

            +---+---+---+---+
elementData  | 6 | 2 | 4 |  |
            +---+---+---+---+

            +---+       +---+
   capacity | 4 |  size | 3 |
            +---+       +---+

它就是这样创造的。

int ar[5] = {6, 2, 4, 7, 3};
PFArray pf;

cout << "==== Test addElement() ===\n";

for (int i = 0; i < 5; ++i) {
    cout << "Insert " << ar[i] << ": ";
    pf.addElement(ar[i]);
    displayResult(pf);
}

我试图编写的addElement()函数看起来像这样。

void PFArray::addElement(int elt)
{
    if (size == capacity)
    {
        int *resized = new int[size*2];
        capacity = size*2;
        for (int i = 0; i < size; i++)
            resized[i] = elementData[i];
        elementData = resized;
        delete [] resized;
    }
    elementData[size++] = elt;
}

我遇到了两个错误。一,在每一行的开头,一个0被添加到数组中。

==== Test addElement() ===
Insert 6: [0,6,]  -- size=2, capacity=2
Insert 2: [0,6,2,]  -- size=3, capacity=4
Insert 4: [0,6,2,4,]  -- size=4, capacity=4
Insert 7: [0,6,2,4,7,]  -- size=5, capacity=8
Insert 3: [0,6,2,4,7,3,]  -- size=6, capacity=8

两,我在EXC_BAD_ACCESS行上收到错误elementData[size++] = elt;

如果有人能指出我做错了什么,我将不胜感激。仅供参考,我对C ++作为一种语言还是比较陌生的。

addElement()的行为如下:

  

在数组中的下一个可用/空插槽中插入新元素elt。如果当前阵列已达到其容量,则创建阵列的副本,其容量首先是旧阵列的两倍,然后将新元素插入新阵列中。您使elementData指向新数组(当然)。但是您还必须删除旧数组以避免内存泄漏。您还必须适当地设置容量和大小。

我试图包含我认为相关的所有代码,但是如果你需要我提供更多代码,我也会很开心!

P.S。我知道向量,但我想将这种方法用于我正在尝试做的事情。

2 个答案:

答案 0 :(得分:3)

elementData = resized;
delete [] resized;

在那里,您已删除分配给elementData的数组,然后您写入:

elementData[size++] = elt;

答案 1 :(得分:1)

像Zdeslav所说,你写一个已删除的数组。正确的方法是:

delete [] elementData;
elementData = resized;

第一个错误似乎出现在displayResult()代码中,但是你还没有包含他的代码。