2017-06-01 130 views
-2

确定的动态数组,所以这些都是我的结构:释放内存数组

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); 

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

+0

@πάνταῥεῖ这是无效C. – user2079303

+1

@ user2079303所以consdier以删除C标签也;-) –

+0

@πάνταῥεῖ好主意! (这可能会保护这个问题不受浪费)@CanciuCostin,请说明您正在使用哪种语言。 – user2079303

回答

-1

有很多原因,你的程序崩溃:

  1. 您正在访问的Student对象name不存在(您明确设置内存为null)
  2. 您重新分配namename尚未分配
  3. 您解除分配Student指针从未被初始化
+0

问题中没有程序。甚至没有有效的C代码。 – Olaf

0

在这一行你的指针

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

,然后你memseting他们为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.