所以我有一个部分填充的数组,有一组函数要为它写。
基本上,数组就像这样。一个整数被添加到下一个可用空闲空间中,当达到容量时,数组加倍并且大小,并且所有元素都被添加到新的空间中。
+---+---+---+---+
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。我知道向量,但我想将这种方法用于我正在尝试做的事情。
答案 0 :(得分:3)
elementData = resized;
delete [] resized;
在那里,您已删除分配给elementData
的数组,然后您写入:
elementData[size++] = elt;
答案 1 :(得分:1)
像Zdeslav所说,你写一个已删除的数组。正确的方法是:
delete [] elementData;
elementData = resized;
第一个错误似乎出现在displayResult()代码中,但是你还没有包含他的代码。