【发布时间】:2017-10-20 10:35:17
【问题描述】:
我不允许使用向量专门用于这项学校作业。我发现的大多数答案都简单地将“您应该使用向量”作为投票最多的评论。虽然我很欣赏并理解这一点,但我只是被限制在这项任务中使用它们。
这是一个具有动态内存管理的 C++ 赋值,如下所示:
// property in header declaration
int numAnimals;
int capacity;
Animal** animals;
void addAnimal(Animal *newAnimal);
// class implementation
capacity = 10;
numAnimals = 0;
animals = new Animal*[capacity];
void SampleClass::addAnimal(Animal *newAnimal)
{
for (int i = 0; i < capacity; i++){
if(animals[i]){
// animal object already exists in array, move on
i++;
}else{
animals[i] = newAnimal;
numAnimals++;
break;
}
}
}
animals 是指向指针的指针,在本例中是指向尚未创建的对象类型 Animal 的指针数组的指针。
使用“addAnimal”函数,我要做的是通过循环指针数组将动物对象添加到数组中,如果已经存在动物对象,则迭代到下一个索引。如果没有动物,则将该动物插入到数组中。
当我尝试访问数组中动物对象的成员函数时,抛出异常“读取访问冲突”。
我的怀疑是因为: if(animals[i]) 可能没有做我认为它正在做的事情,通过调试器运行它我从来没有点击“else”部分,所以当方法完成时,数组仍然充满了没有设置为任何对象的指针.因此,当我尝试访问成员函数时,它属于一个不存在的对象。
那么,如果我的怀疑是正确的,那么以这种方式将新对象插入指针数组的最佳方法是什么?它们需要是指针,否则它会自动创建充满填充对象的数组,这不是我想要的。
我没有发布所有代码,因为我想让我的问题保持简短,抱歉我是 C++ 和 stackoverflow 的新手。是的,我知道之后要删除 [] 以清除内存。
感谢任何帮助,谢谢!
【问题讨论】:
-
您已经拥有
numAnimals。只需使用它:animals[numAnimals] = newAnimal;不要搜索。 -
if(animals[i])is 测试空指针,但是当您从new获取内存时,不能保证指针为空。无论如何,使用numAnimals似乎是一个更好的主意。 -
感谢@manni66,快速响应,在您提出时非常明显。 sp2danny 的答案也是我一直在寻找的,尽管我同意您的提示适用于我的用例。
标签: c++ arrays pointers memory-management