为数组的动态数组释放内存
Freeing up memory for a dynamic array of array
好的,这些是我的结构:
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);
如果我只写最后一行它可以工作,但不会产生内存泄漏?
您的程序崩溃的原因有很多:
- 您正在访问不存在的 Student 对象中的
name
(您已明确将内存设置为空)
- 当
name
尚未分配时,您正在取消分配 name
- 您正在释放
Student
从未初始化的指针
在这一行中,您要为指针向量分配内存
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.
好的,这些是我的结构:
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);
如果我只写最后一行它可以工作,但不会产生内存泄漏?
您的程序崩溃的原因有很多:
- 您正在访问不存在的 Student 对象中的
name
(您已明确将内存设置为空) - 当
name
尚未分配时,您正在取消分配name
- 您正在释放
Student
从未初始化的指针
在这一行中,您要为指针向量分配内存
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.