【问题标题】:Freeing up memory for a dynamic array of array为数组的动态数组释放内存
【发布时间】:2017-11-02 21:45:06
【问题描述】:

好的,这些是我的结构:

struct Student
{
    int id;
    char* name;
};

struct HashTable
{
    int size;
    int noElements;
    Student** elements;
};

这里我为动态数组分配内存

ht.elements = (Student**)malloc(size*sizeof(Student*));
memset(ht.elements, NULL, size*sizeof(Student*));

我的问题是,当我尝试像这样释放内存时,为什么我的程序会崩溃?

for(int i=0;i<ht.size;i++)
{
free(ht.elements[i]->name);
free(ht.elements[i]);
}
free(ht.elements);

如果我只写最后一行它可以工作,但它不会产生内存泄漏?

【问题讨论】:

  • @πάνταῥεῖ 这是无效的 C.
  • @user2079303 所以也应该删除 c 标签 ;-)
  • @πάνταῥεῖ 好主意! (这可能会保护问题免受一波反对票)@CanciuCostin,请说明您使用的是哪种语言。
  • @CanciuCostin 你没有显示数据成员名指向的内存分配在哪里,是否确实分配了。
  • @CanciuCostin 考虑到要使程序成为有效的 C 程序,您必须至少编写 struct Student** 元素;

标签: c arrays memory-leaks dynamic-memory-allocation


【解决方案1】:

在这一行中,您正在为指针向量分配内存

ht.elements = (Student**)malloc(size*sizeof(Student*));

然后您将它们设置为 NULL。这意味着您没有元素矩阵,而是指向不指向任何内容的元素的指针向量。 所以这些行会导致问题

free(ht.elements[i]->name) // here you are dereferencing a null pointer, this will cause a segmentation fault
free(ht.elements[i]); // here you are calling free on a null pointer. Depending on your compiler, this could cause problems.

【讨论】:

    【解决方案2】:

    您的程序崩溃的原因有很多:

    1. 您正在访问不存在的 Student 对象中的 name(您已将内存显式设置为 null)
    2. name 尚未分配时,您正在释放name
    3. 您正在释放从未初始化过的 Student 指针

    【讨论】:

    • 问题中没有程序。甚至没有有效的 C 代码。
    猜你喜欢
    • 2017-06-04
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多