Mat*_*w S 3 c++ arrays pointers memory-management
我不允许专门为此学校作业使用向量.我发现的大多数答案只是说"你应该使用向量"作为最高投票评论.虽然我很欣赏并理解这一点,但我只是限制使用它们来完成这项任务.
它是一个带有动态内存管理的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
animals是指向指针的指针,在这种情况下是指向尚未创建的对象类型Animal的指针数组的指针.
使用'addAnimal'函数,我要做的是通过循环遍历指针数组将动物对象添加到数组中,如果已存在动物对象,则迭代到下一个索引.如果没有动物,则将该动物插入阵列.
当我尝试访问数组中动物对象的成员函数时,我得到一个异常抛出"读取访问冲突".
我的怀疑是因为: if(animals [i])可能没有做我认为它正在做的事情,通过调试器运行它我从未点击'else'部分,所以数组仍然没有设置任何对象的指针当方法完成时.因此,当我尝试访问成员函数时,它是一个不存在的对象.
那么,如果我的怀疑是正确的,那么以这种方式将新对象插入指针数组的最佳方法是什么?它们需要是指针,否则它会自动创建充满填充对象的数组,这不是我想要的.
我没有发布所有代码,因为我想保持我的问题简短,道歉我是一个新的C++和stackoverflow一般.是的,我知道删除[]后清除内存.
任何帮助表示赞赏,谢谢!
因为在numAnimals你保持数组中当前动物指针数的数量,你不需要for循环找到第一个可用的插槽来添加一个新的动物指针(请注意,假设你想使用for如图所示的循环你的代码,你必须注意正确初始化数组中的所有初始指针nullptr).
你可以使用:
// Inside SampleClass::addAnimal(Animal *newAnimal):
animals[numAnimals] = newAnimal;
numAnimals++;
Run Code Online (Sandbox Code Playgroud)
请注意,当您插入新动物时,您必须注意不要溢出阵列容量.
因此,在插入新动物之前,您必须检查阵列中是否有足够的空间,例如:
// Before inserting:
if (numAnimals == capacity)
{
// You ran out of capacity.
//
// 1. Allocate a new array with bigger capacity (e.g. 2X)
// 2. Copy the content from the current array to the new one
// 3. delete current array
}
Run Code Online (Sandbox Code Playgroud)
作为旁注:
是的,我知道要
delete[]事后清理记忆
请注意,如果你调用delete[]上animals的指针数组,你释放这个指针数组,而不是将Animal对象指向.