将对象插入具有动态内存的数组中(不允许向量)C
我不允许专门为此学校作业使用向量.我发现的大多数答案只是说“你应该使用向量”作为最高投票评论.虽然我很欣赏并理解这一点,但我只是限制使用它们来完成这项任务.
它是一个具有动态内存管理的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’函数,我要做的是通过循环遍历指针数组将动物对象添加到数组中,如果已存在动物对象,则迭代到下一个索引.如果没有动物,则将该动物插入阵列. 当我尝试访问数组中动物对象的成员函数时,我得到一个异常抛出“读取访问冲突”. 我的怀疑是因为: 那么,如果我的怀疑是正确的,那么以这种方式将新对象插入指针数组的最佳方法是什么?它们需要是指针,否则它会自动创建充满填充对象的数组,这不是我想要的. 我没有发布所有代码,因为我想保持我的问题简短,道歉我是一个新的C和stackoverflow一般.是的,我知道删除[]后清除内存. 任何帮助表示赞赏,谢谢! 解决方法
因为在numAnimals中你保持数组中当前动物指针数的计数,你不需要for循环来找到第一个可用的插槽来添加一个新的动物指针(注意,假设你想要使用for循环如你的代码中所示,你必须注意正确地将数组中的所有初始指针初始化为nullptr).
你可以使用: // Inside SampleClass::addAnimal(Animal *newAnimal): animals[numAnimals] = newAnimal; numAnimals++; 请注意,当您插入新动物时,您必须注意不要溢出阵列容量. // 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 } 作为旁注:
请注意,如果在animals数组指针上调用delete [],则释放此指针数组,但不释放指向的Animal对象. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- Unity3d_Unity3d"Library\UnityAssemblies&
- xml布局文件里直接使用背景图导致爆内存的情况处理
- 将boost :: signal包装到C#代理
- C语言中 int main(int argc,char *argv[])的两个参数详解
- oracle – USER()和SYS_CONTEXT(‘USERENV’,’CURRENT_USE
- C#数据类型
- c – 使用constexpr initializer_list构造函数时,MSVC无法编
- ruby-on-rails – 使用Rails 3的Chrome中的Google Analytic
- Ruby中gem包管理器的用法及用bundler来管理多版本的gem
- Oracle中使用PL/SQL如何定义参数、参数赋值、输出参数和 if