在C ++中扩展数组的问题

时间:2010-04-11 20:13:00

标签: c++ templates arrays expand

我正在为课堂写作模拟,其中一部分涉及有机体的复制。我的生物被保存在一个阵列中,我需要在它们繁殖时增加阵列的大小。因为我有多个生物的多个类,所以我使用了一个模板:

template <class orgType>
void expandarray(orgType* oldarray, int& numitems, int reproductioncount)
{
    orgType *newarray = new orgType[numitems+reproductioncount];

    for (int i=0; i<numitems; i++) {
        newarray[i] = oldarray[i];
    }

    numitems += reproductioncount;

    delete[] oldarray;
    oldarray = newarray;
    newarray = NULL;
}

但是,这个模板似乎在某种程度上破坏了我的数据。我可以在没有再现的情况下运行该程序(注释掉对expandarray的调用),但调用此函数会导致程序崩溃。该程序在expandarray函数中不会崩溃,但稍后会在访问冲突时崩溃。

我已经编写了数百次扩展数组的函数,而且我不知道这次搞砸了什么。我的功能有什么明显的错误吗?它看起来对你好吗?

编辑:感谢大家的帮助。我无法相信我错过了一些如此明显的东西。回应使用std::vector:我们还没有在课堂上讨论它,而且看起来很傻,我需要用我们教过的方法编写代码。

3 个答案:

答案 0 :(得分:9)

您需要将oldarray作为参考传递:orgType *& oldarray。它当前编写的方式,该函数将删除调用者的数组,但不会给它新分配的数组,导致崩溃。

更好的是,使用std::vector而不是重新实现它。

答案 1 :(得分:3)

C ++标准库已经具有执行此操作的功能。

使用std::vector容器。

答案 2 :(得分:0)

看起来你正在修改指针oldarray以指向新数组,但请记住在函数中只是一个副本,并且不会影响你传入的变量。你可能需要传递对指针的引用,如果你我想这样做。

事实上,std :: vector无论如何都会为你做这件事