如何调整动态分配的多态对象数组的大小?

Posted

技术标签:

【中文标题】如何调整动态分配的多态对象数组的大小?【英文标题】:How to resize a dynamically allocated array of polymorphic objects? 【发布时间】:2012-11-21 18:46:01 【问题描述】:

我有一个动态分配的多态对象数组,我想在不使用 STL 库(向量等)的情况下调整其大小。我尝试将原始数组移动到临时数组,然后删除原始数组,然后将原始数组设置为临时数组,如下所示:

int x = 100;
int y = 150;

Animal **orig = new Animal*[x];
Animal **temp = new Animal*[y];

//allocate orig array
for(int n = 0; n < x; n++)

    orig[n] = new Cat();


//save to temp
for(int n = 0; n < x; n++)

    temp[n] = orig[n];


//delete orig array
for(int n = 0; n < x; n++)

    delete orig[n];

delete[] orig;

//store temp into orig
orig = temp;

但是,当我尝试访问该元素时,例如:

cout << orig[0]->getName();

我得到一个糟糕的内存分配错误:

Unhandled exception at at 0x768F4B32 in file.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0033E598.

【问题讨论】:

如果您提供了Animal 的最小实现,以便您的代码 sn-p 可以编译和运行,那么跟踪问题会更容易。鉴于您使用的是 C++,为什么要避免使用 std::vector 因为刚开始使用 C++ 的人害怕标准库,这就是原因! STL 很大,很可怕,而且难以理解,您不确定它是否会按照您的预期运行。所以人们开始自己做事。 @Joker_vD 这确实是一个糟糕的论点(但我怀疑你知道这一点)。 std::vector 应该在 new 甚至 C 样式数组之前学习好,因为它比任何一个都更容易使用。 (而且他正在做一个数组new。虽然学习一些没有实际用途的东西?) 在学习指针的东西之前,你当然应该学习如何使用 STL,但这不是 C++ 课程的组织方式。当你知道指针和数组时,第一次接触 STL 确实会让你感到不安——因为你试图想象它实际上是如何处理指针和数组的,你会感到困惑,然后想,“哎呀,不,我会自己做,我不需要任何std:: 的东西”。我告诉你的内容是基于我与大学里学习相同编程课程的朋友的谈话。 第二个@JamesKanze。将“Accelerated C++”视为示例文本,它很好地专注于标准库组件,然后再了解所有细节。 【参考方案1】:
//delete orig array
for(int n = 0; n < x; n++)

    delete orig[n];

对于这种特殊情况,不要这样做。您实际上是在删除对象而不是数组。因此临时数组中的所有对象都指向无效位置。只需执行delete [] orig 即可释放原始数组。

【讨论】:

【参考方案2】:

你抄错了。而不是复制你的临时数组只是指向与原点相同的位置。现在,当您删除 orig 时,临时指针指向无效位置。

//save to temp
for(int n = 0; n < x; n++)

    //temp[n] = orig[n];
    // Try this instead
    strcpy(temp[n], orig[n]);

【讨论】:

以上是关于如何调整动态分配的多态对象数组的大小?的主要内容,如果未能解决你的问题,请参考以下文章

如何复制动态分配的对象(具有一个类的 const 成员)

获取动态分配的数组大小

如何以多态方式创建对象的动态数组?

在VBScript中调整对象内部的数组大小

调整动态分配的指针数组的大小(复制构造函数不起作用?)

如何使用动态索引更新对象数组?