【问题标题】:Problems Expanding an Array in C++在 C++ 中扩展数组的问题
【发布时间】:2010-04-11 20:13:00
【问题描述】:

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

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:我们还没有在课堂上讨论过,虽然看起来很傻,但我需要使用我们学过的方法编写代码。

【问题讨论】:

  • 你为什么不用std::vector
  • @dxq:欢迎来到 StackOverflow。以后,如果您对作业有任何疑问,请在其中添加[homework]标签。它可以帮助您在允许使用的语言的有限子集中获得问题的最佳答案。 :-)
  • vector之前教手动内存管理?完全错误的方式。这很糟糕(但很典型)。另一方面,要求解决方案仅限于已经教授的工具是合理的。
  • 需要注意的一点 - 如果 orgType 包含指向其他 orgType 值的指针(例如,如果您有指向父生物体的指针),那么复制操作很可能必须复杂得多比您使用的相对简单的复制分配操作。
  • 如果你已经了解了什么是类,我强烈建议你编写自己的 vector 包装器并使用它。然后问你的老师为什么他让你浪费时间。

标签: c++ templates arrays expand


【解决方案1】:

您需要传递 oldarray 作为参考:orgType *&amp; oldarray。按照目前的写法,函数会删除调用者的数组,但不会给它新分配的数组,导致崩溃。

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

【讨论】:

    【解决方案2】:

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

    使用std::vector 容器。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-10
        • 2011-10-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多