分配和删除指针数组

时间:2015-02-24 03:57:57

标签: c++ pointers dynamic-memory-allocation

给出以下结构声明:

struct Student

{

   char *     name;

   float      gpa;

}

实施以下功能:

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

上面的函数动态创建一个指向Student对象的指针数组。它分配Student对象并将它们的名称设置为传入“names”并将gpa设置为0.“size”是可用的“名称”数。该函数返回指向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;&#34;访问冲突读取位置0x00000000&#34;取消分配内存时出错。 。为什么它会给我这个错误,我该如何解决?谢谢

2 个答案:

答案 0 :(得分:2)

createStudentList

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

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

答案 1 :(得分:1)

你几乎就在那里,但你的createStudentList功能有一些问题。首先,检查这一行的括号:

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

它没有做你想做的事。

接下来,考虑一下这条线的确在做什么,

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

您是否正在尝试制作字符串的副本(您必须这样做,因为您正在为其分配内存)?如果是这样,请考虑另一条线。