0

我有以下函数。我认为 free(temp) 没有释放所有分配的内存。当我给这三个字段 NULL 时,我的程序工作正常。当我给它们提供常规值时,我的程序在 20 分钟后被 Linux 杀死正常的 IO 操作。在 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;
}
4

2 回答 2

0

由于 C 不知道分配了哪些指针以及从静态内存中分配了哪些指针,因此您必须显式地释放您malloc()之前编辑的所有内容。否则你有内存泄漏。

例如,如果 a 的内容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)or free(temp),您将丢失指针,而内存仍保持分配状态。

类似地,你必须在与释放它相同的条件下释放所有东西。

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

于 2013-11-07T21:26:06.723 回答
0

free() 不知道其他指向被释放的指针内的 malloc 内存的指针。free() 将 void * 作为输入参数,因此 free() 不知道被释放的结构的类型。

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

于 2013-11-07T21:33:32.353 回答