gpt4 book ai didi

c++ - 分配和删除指针数组

转载 作者:行者123 更新时间:2023-11-28 00:18:39 24 4
gpt4 key购买 nike

给定以下结构声明:

struct Student

{

char * name;

float gpa;

}

实现以下功能:

Student ** createStudentList(char ** names, int size);

上面的函数动态地创建了一个指向 Student 对象的指针数组。它分配Student对象并设置他们的名字为传入的“names”和gpa为0。“size”是可用的“names”的数量。该函数返回指向Student指针数组的指针。

bool destroyStudentList(Student ** studentList, int size);

上述函数删除数组中的所有 Student 对象及其动态分配的数据成员,例如 name。它还释放指向 Student 对象的指针数组。如果操作成功,该函数返回 true,如果“studentList”包含 nullptr,则返回 false。

这是我的功能:

Student ** createStudentList(char ** names, int size){

Student **studentList;
studentList = new Student*[size];

for (int i = 0; i < size; i++) {
studentList[i] = new Student;
studentList[i]->name = new char[strlen(names[i]+1)];
studentList[i]->name = names[i];
studentList[i]->gpa = 0;
}

return studentList;
}



bool destroyStudentList(Student ** studentList, int size) {
if (studentList = NULL)
return false;

else {
for (int i = 0; i < size; i++) {
delete [] studentList[i]->name;
studentList[i]->name = nullptr;
delete studentList[i];
studentList[i] = nullptr;
}
delete[] studentList;
return true;
}
}

看起来函数 createStudentList 工作正常,但在尝试为 delete [] studentList[i]->name; 释放内存时出现错误“访问冲突读取位置 0x00000000”。为什么它会给我这个错误,我该如何解决?谢谢

最佳答案

createStudentList 中:

...
studentList[i]->name = new char[strlen(names[i]+1)];
studentList[i]->name = names[i];
...

哎呀!您分配内存,然后放弃它并将 name 指针设置为指向属于参数 names 的内容。你不应该期望那个东西在你需要它的时候仍然存在,并且根据你的错误消息判断它已经超出范围或被删除。

关于c++ - 分配和删除指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28687903/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com