我的作业是我必须制作一个类(寄存器),其中包含动物类中的3类阵列(鸟类,哺乳动物,爬行动物)。 Animal是Register的朋友。我只会展示鸟类的一部分,以保持简单。
寄存器类如下:
class Register
{
Bird* birds;
unsigned int birdSize;
public:
...
}
注册的构造函数:
Register::Register()
{
this->birds = new Bird[0];
this->birdSize = NULL;
}
现在我在寄存器中有一个函数,它将一个元素添加到birds数组中,输入是cin。
void Register::add()
{
...
if (birdSize == 0)
{
birds = new Bird[0];
Bird* temp = new Bird[0];
temp[0].add();
this->birds = temp;
birdSize++;
}
else
{
Bird* temp = new Bird[birdSize+1];
for (unsigned int i=0; i<=birdSize; i++)
{
temp[i] = this->birds[i];
}
temp[birdSize+1].add();
birds = new Bird[birdSize+1];
birds = temp;
birdSize++;
}
temp [0] .add()有cin,它工作正常。当我运行程序时,用户必须向阵列添加2只鸟。到达&#39; else&#39;下的部分时出现问题,因此数组的第二个元素。该程序肯定会达到&#34; temp [birdSize + 1] .add();&#34;在运行时,&#34; xyz.exe已停止工作&#34;窗口弹出,它在细节中说明&#34;故障模块名称:StackHash_7e8e&#34;所以我确定内存分配有问题,但问题是当我尝试在调试模式下找到有问题的行时,一切正常。
嗯,不是一切。该程序有一个print()函数,它打印出Register中的所有内容。数组的第二个元素与第一个元素相同。
我不知道该怎么做。我阅读了很多论坛帖子,阅读了一本cpp书,看过在线教程,但我无法找到解决这个问题的方法。请帮忙。
答案 0 :(得分:2)
数组索引从0
开始。所以在else
部分你正在编写
Bird* temp = new Bird[birdSize+1]; // size =birdSize +1;
因此有效的索引范围将是 0 - > birdSize ,不是birdSize + 1 。
问题是
temp[birdSize+1].add();
您正在使用birdSize+1
索引。它应该是
temp[birdSize].add();
您的代码中还有其他错误:
for (unsigned int i=0; i<=birdSize; i++) // should be i<birdSize
{
temp[i] = this->birds[i];
}
您的计划中还有其他不良编码:
Register::Register()
{
this->birds = new Bird[0]; // should be this->birds=NULL
this->birdSize = NULL; // should be this->birdSize = 0
}
显然,如果你的作业没有要求它,你就不应该以这种方式使用array
。对于可变大小的容器,请使用vector, list...
。 Array
仅在大小已修复时才会出现。