簡體   English   中英

free()錯誤(使用valgrind調試)?

[英]free() errors (debugging with valgrind)?

我有這些結構:

typedef struct _Frag{
  struct _Frag *next;
  char *seq;
  int x1; 
  int length;  
}Frag;

typedef struct _Fragment{ 
  int type; 
  Frag *frag_list;   
}Fragment;

然后我創建了一個數組

Fragment *fragments=malloc(1,sizeof(Fragment)); // or more
fragments->frag_list=malloc(1,sizeof(Frag)); // or more
Frag *frag=malloc(10,sizeof(Frag));
frag->seq="test str\n";
...
frag->next=malloc(1,sizeof(Frag));
frag->next->seq="test str\n";

在程序結束時,我想釋放內存,該函數是:

static void free_frags(){
  int i;
  Fragment *fragment;
  Frag *current,*next;
  for(i=0;i<1;i++){
    fragment=&snp_frags[i];
    current=fragment->frag_list;
    next=current->next;

    while(next!=NULL){
      free(current->seq);
      //free(current->next);
      free(current);
      current=next;
      next=current->next;
    }
    free(current->seq);
    //free(current->next);
    free(current);
    //free(fragment->frag_list);
    free(&snp_frags[i]);
  }
  free(snp_frags);
}

如果我使用valgrind對其進行調試,則valgrind表示:

=============================================
==3810== Invalid read of size 4
==3810==    at 0x80490FD: free_snp (hap.c:16)
==3810==    by 0x80493AF: main (hap.c:73)
==3810==  Address 0x41b139c is 12 bytes inside a block of size 296 free'd
==3810==    at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810==    by 0x8049167: free_snp (hap.c:30)
==3810==    by 0x80493AF: main (hap.c:73)
==3810== 
==3810== Invalid free() / delete / delete[]
==3810==    at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810==    by 0x8049167: free_snp (hap.c:30)
==3810==    by 0x80493AF: main (hap.c:73)
==3810==  Address 0x41b1398 is 8 bytes inside a block of size 296 free'd
==3810==    at 0x4023EBA: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==3810==    by 0x8049167: free_snp (hap.c:30)
==3810==    by 0x80493AF: main (hap.c:73)

並且請幫助我解決這些錯誤,thanx。

frag->seq="test str\n";

您尚未malloc分配內存塊-字符串是在靜態存儲中分配的-稍后您嘗試free()該內存塊。 您只能free()通過malloc()分配的free()塊,否則可能會遇到不確定的行為。

您可以只將指向靜態分配的字符串的指針放入Frag::seq字段中,而從不對它們進行free() ,也可以為這些字符串使用malloc()內存,然后將字符串復制到malloc的塊中。

您似乎在說要釋放該內存,這是程序的最后一件事。

何必呢? 為什么不退出呢? 這樣,您的分配將是完美的,並且速度更快。 實際上,這是推薦的技術。

我敢肯定,沒有評論者能夠舉一個不能從終止程序中釋放內存資源的操作系統示例。 沒有這個關鍵的操作系統功能,^ C,kill,任務管理器,程序錯誤,程序崩潰……每個異常終止都會泄漏內存。

  1. 您經常調用molloc()而不是malloc() 檢查您的元音。
  2. 您正在使用錯誤數量的參數調用malloc() -僅需一個參數。
  3. 您不能分配字符串-執行指針分配,這不是您想要的。 您必須使用strcpy()strncpy()memcpy() ,具體取決於您對整個*cpy()混亂的*cpy() ,將一個字符串的內容復制到另一個字符串中。

刪除代碼行“ free(fragment)”。 它將運作良好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM