【问题标题】:Allocate and dellete array of pointers分配和删除指针数组
【发布时间】:2015-02-24 03:57:56
【问题描述】:

给定以下结构声明:

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]-&gt;name; "访问冲突读取位置 0x00000000" 释放内存时出现错误。为什么它给我这个错误,我该如何解决?谢谢

【问题讨论】:

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


    【解决方案1】:

    createStudentList:

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

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

    【讨论】:

      【解决方案2】:

      您快到了,但您的createStudentList 函数存在一些问题。首先,检查这一行的括号:

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

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

      接下来,想想这条线到底在做什么,

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

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

      【讨论】:

      • 我想我应该做 *studentList[i]-&gt;name = *names[i]; 而不是 studentList[i]-&gt;name = names[i]; 。但我看不出studentList[i]-&gt;name = new char[strlen(names[i]+1)];的括号错误在哪里
      • c风格的字符串是一个字符数组,不能这样复制。有关可用功能,请参阅the cstring header
      • 试着拆开你的 new 声明。 names[i] + 1 会给什么?随后,strlen (names[i] + 1) 给出了什么?可能不是你所期望的。
      • 我现在得到了这个studentList[i]-&gt;name = new char[strlen(names[i]) + 1];strcpy(studentList[i]-&gt;name, names[i]);。我认为问题不在于复制 c-string 而在于内存分配中,因为即使我用 copy 注释掉行,我也会得到同样的错误
      • 谢谢,找到问题if (studentList = NULL)
      猜你喜欢
      • 2011-12-17
      • 2019-09-17
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2020-09-25
      • 2013-03-02
      • 1970-01-01
      相关资源
      最近更新 更多