分配和删除指针数组

Allocate and dellete array of pointers

给定以下结构声明:

struct Student

{

   char *     name;

   float      gpa;

}

实现以下功能:

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

上述函数动态创建了指向 Student 对象的指针数组。它分配Student对象并将它们的名称设置为传入的“names”和gpa为0。“size”是“names”的数量available.The函数returns指向Student指针数组的指针。

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

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

这是我的功能:

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; "Access violation reading location 0x00000000" 释放内存时出现错误。为什么它会给我这个错误,我该如何解决?谢谢

createStudentList中:

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

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

您快完成了,但是您的 createStudentList 功能存在一些问题。首先,检查这一行的括号:

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

它并不完全符合您的要求。

接下来想想这行到底是干什么的,

studentList[i]->name = names[i];

您是否正在尝试复制该字符串(您必须这样做,因为您正在为其分配内存)?如果是这样,再考虑一下这条线。