【问题标题】:C++ partially filled dynamic arrayC++ 部分填充的动态数组
【发布时间】:2016-05-22 21:19:07
【问题描述】:

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

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

            +---+---+---+---+
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

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

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

addElement()的行为如下。

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

我已尝试包含所有我认为相关的代码,但是如果您需要我提供更多,我也会很高兴!

附:我知道 Vectors,但想将这种方法用于我正在尝试做的事情。

【问题讨论】:

  • 除非您的目的只是了解原始数组的工作原理,否则请使用std::vector,不要浪费时间管理大小/容量等。
  • @SteveFallows 刚刚编辑了帖子说这个,不幸的是我不能使用矢量。

标签: c++ arrays pointers memory


【解决方案1】:
elementData = resized;
delete [] resized;

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

elementData[size++] = elt;

【讨论】:

    【解决方案2】:

    就像 Zdeslav 所说,您写入已删除的数组。正确的做法是:

    delete [] elementData;
    elementData = resized;
    

    第一个错误似乎在 displayResult() 代码中,但您没有包含他的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-07
      • 1970-01-01
      • 2023-01-24
      • 2021-12-16
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多