如何调整动态分配的多态对象数组的大小?
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]);
【讨论】:
以上是关于如何调整动态分配的多态对象数组的大小?的主要内容,如果未能解决你的问题,请参考以下文章