我正在为课堂写作模拟,其中一部分涉及有机体的复制。我的生物被保存在一个阵列中,我需要在它们繁殖时增加阵列的大小。因为我有多个生物的多个类,所以我使用了一个模板:
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
:我们还没有在课堂上讨论它,而且看起来很傻,我需要用我们教过的方法编写代码。
答案 0 :(得分:9)
您需要将oldarray作为参考传递:orgType *& oldarray
。它当前编写的方式,该函数将删除调用者的数组,但不会给它新分配的数组,导致崩溃。
更好的是,使用std::vector
而不是重新实现它。
答案 1 :(得分:3)
C ++标准库已经具有执行此操作的功能。
使用std::vector
容器。
答案 2 :(得分:0)
看起来你正在修改指针oldarray以指向新数组,但请记住在函数中只是一个副本,并且不会影响你传入的变量。你可能需要传递对指针的引用,如果你我想这样做。
事实上,std :: vector无论如何都会为你做这件事