我正在编写一个动态大小的数组的实现。代码编译没有错误,但数组元素不能正确复制。它们似乎只是被擦除(用0覆盖)。尝试在数组元素上调用getter会导致段错误。
该数组包含一些基本类对象的指针;这是我的代码和我查找的示例之间的主要区别。
这是功能:
// Pointer to array of pointers
SomeClass** mainArray = new SomeClass[1];
int numItems = 0;
void AddItemDynamic(SomeClass* newVal) {
SomeClass** tempArray = new SomeClass*[numItems+1];
// Copying pointers to bigger array
for (int i = 0; i < numItems - 1; i++) {
tempArray[i] = mainArray[i];
}
numItems++;
// Adding the new value
tempArray[numItems] = newVal;
delete [] mainArray;
mainArray = tempArray;
}
代码应该复制数组元素,然后将指针重新分配给新创建的数组。相反,指针似乎设置为其他东西。
如果当前数组中包含numItems
元素,那么循环
for (int i = 0; i < numItems - 1; i++)
将比numItems
元素复制少一个。
当你添加新元素时,你会超出新数组的范围,因为你将numItems
增加到了早期。
所以在同一个函数中有两个逐个错误,每个方向一个错误。
正如a comment(感谢Ayxan)中所提到的,第一个逐个错误意味着前两次调用此函数时,复制循环将不会发生。当第一次这样做时,这实际上是好的,因为没有什么可以复制,但第二次应该有一些东西要复制,但循环(当前)不会运行。