我有以下功能。我认为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;
}
答案 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()不知道指针内的malloc'd内存的其他指针是免费的。 free()接受一个void *作为输入参数,因此free()不知道被解除分配的struct的类型。
在释放temp之前,你需要在temp中释放所有其他内存。