0

我正在尝试实现一个函数,该函数可以将任何数据类型的动态数组的大小增加一,让数组保留所有现有数据。

我想这样做,因为我们经常需要在课堂上的实际项目中使用和调整动态数组的大小,所以尽管我想,我不能使用向量。

我首先想知道这是否可以做到,如果可以,是否有人可以告诉我如何做。

这就是我到目前为止所拥有的。

template <typename Temp>
void incArraySize(Temp * dynamicArray, int i_Elements)
{
    Temp * dummyArr = new Temp [i_Elements];
    for (int l = 0; l < i_Elements; l++)
        dummyArr[l] = dynamicArray[l];

    delete [] dynamicArray;
    dynamicArray = new Temp [i_Elements+1];

    for (int l = 0; l < i_Elements; l++)
        dynamicArray[l] = dummyArr[l];

    delete [] dummyArr;
}

这在第一次调用该函数时工作正常,但随后出现访问冲突。

4

3 回答 3

1

dynamicArray应该通过引用传递,

void incArraySize(Temp*& dynamicArray, int i_Elements)

否则,该行中的重新绑定dynamicArray = new Temp [i_Elements+1];将不会应用到函数之外。

也就是说,当你打电话

int* array = new int[10];
incArraySize(array, 10);
// line 3:
std::cout << array[0];

在第 3 行,数组已被 删除[] incArraySize,但array变量仍指向这个旧的、已删除的数组。这就是您获得访问冲突的原因。


你考虑过std::vector<Temp>吗?标准库类型可以为您正确管理内存和大小,并且更易于使用。

于 2013-06-19T20:29:24.267 回答
1

将数组的大小增加一将非常低效,尤其是在您需要多次执行此操作时。我建议牺牲一些内存并使用比您需要的更多的空间,或者使用可以使用 .push() 方法的列表

在您当前的方法中,您似乎正在复制指向新数组的指针,而不是将单个值从虚拟数组复制到动态数组,请尝试在 for 循环中使用 new 关键字以确保每次复制时都传递数据结束了

于 2013-06-19T20:32:36.247 回答
1

为什么要两本?正如 KennyTM 所说,您需要参考:

template <typename Temp>
void incArraySize(Temp *& dynamicArray, int i_Elements)
{
    Temp * p = new Temp[i_Elements + 1];

    for (int l = 0; l < i_Elements; l++)
        p[l] = dynamicArray[l];

    delete [] dynamicArray;

    dynamicArray = p;

}
于 2013-06-19T20:33:26.063 回答