从内存中释放一个struct数组

时间:2013-11-07 21:11:06

标签: c

我有以下功能。我认为free(temp)并没有释放所有分配的内存。当我给这三个字段赋值时,我的程序运行正常。当我给它们定期赋值时,我的程序被Linux杀死正常IO操作20分钟后。对于20分钟,我的程序最初运行速度很快,在被杀之前变慢。所以我想我应该释放字段的分配或其他正在发生的事情?字段是char *。

void traverseAlignLList()
{
Node1 *temp;  
struct Node *old_node;
int temp_counter=0; 
int i;
cur_node=start_node;
temp=malloc(alignCounter*sizeof(Node1));
while(cur_node!=NULL)
{               temp[temp_counter].template_id=malloc((strlen(cur_node->template_id)+1)*sizeof(char));

 strcpy(temp[temp_counter].template_id,cur_node->template_id);  


  temp[temp_counter].target_sequence=malloc((strlen(cur_node->target_sequence)+1)*sizeof(char));

  strcpy(temp[temp_counter].target_sequence,cur_node->target_sequence);
  temp[temp_counter].template_sequence=malloc((strlen(cur_node->template_sequence)+1)*sizeof(char));

  strcpy(temp[temp_counter].template_sequence,cur_node->template_sequence);

  temp_counter++;

  old_node=cur_node;
  cur_node=cur_node->next;

  free(old_node);



  addAlignData(temp);


  free(temp);
  temp=NULL;

  start_node=NULL;
}

2 个答案:

答案 0 :(得分:0)

由于C没有关于哪些指针被分配以及哪些指针被分配的概念。 G。从静态记忆中,你必须明确地释放你之前malloc()编辑过的所有内容。否则你有内存泄漏。

,如果Node1的内容是

.template_id=malloc((strlen(cur_node->template_id)+1)*sizeof(char));
.target_sequence=malloc((strlen(cur_node->target_sequence)+1)*sizeof(char));
.template_sequence=malloc((strlen(cur_node->template_sequence)+1)*sizeof(char));

你必须在以后再次释放它们。

仅使用free(old_node)free(temp),在内存仍然分配的情况下,您将丢失指针。

同样地,你必须在释放它的同一条件下释放所有东西。

如果您malloc() temp,然后跳过while循环,则会丢失它。

答案 1 :(得分:0)

free()不知道指针内的m​​alloc'd内存的其他指针是免费的。 free()接受一个void *作为输入参数,因此free()不知道被解除分配的struct的类型。

在释放temp之前,你需要在temp中释放所有其他内存。