2

我正在为班级写一个模拟,其中一部分涉及生物的繁殖。我的生物体保存在一个数组中,当它们繁殖时我需要增加数组的大小。因为我有多个生物体的多个类,所以我使用了一个模板:

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 函数期间不会崩溃,但稍后会在访问冲突时崩溃。

我已经编写了数百次扩展数组的函数,但我不知道这次我搞砸了什么。我的功能有什么明显的错误吗?你觉得合适吗?

编辑:感谢大家的帮助。我不敢相信我错过了这么明显的东西。作为回应 using std::vector: 我们还没有在课堂上讨论过,虽然看起来很愚蠢,但我需要使用我们学过的方法编写代码。

4

3 回答 3

9

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

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

于 2010-04-11T20:15:05.503 回答
3

C++ 标准库已经为此编写了功能。

使用std::vector容器。

于 2010-04-11T20:15:27.127 回答
0

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

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

于 2010-04-11T20:15:45.950 回答