【发布时间】: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++”视为示例文本,它很好地专注于标准库组件,然后再了解所有细节。
标签: c++ arrays dynamic polymorphism dynamic-memory-allocation