0

私はこれらの構造体を持っています:

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)

そして、私がこれらのエラーを修正するのを手伝ってください、ありがとう。

4

4 に答える 4

7

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

malloc'メモリブロックを作成していません-文字列は静的ストレージに割り当てられています-後でfree()そのメモリブロックを使用しようとします。free()で割り当てられたブロックのみをブロックできmalloc()ます。そうしないと、未定義の動作に遭遇するリスクがあります。

静的に割り当てられた文字列へのポインタのみをFrag::seqフィールドに配置し、フィールドには配置しないfree()malloc()、これらの文字列をメモリして文字列をmalloc'edブロックにコピーすることができます。

于 2009-09-01T07:51:54.927 に答える
1

プログラムが最後に行うこととして、このメモリを解放していると言っているようです。

なぜわざわざ?なぜただ終了しないのですか?そうすれば、割り当て解除は完璧になり、より速くなります。これは実際に推奨される手法です。

終了するプログラムからメモリリソースを解放しないOSの例を引用できるコメント投稿者はいないと確信しています。この重要なOS機能がないと、^ C、kill、タスクマネージャー、プログラムのバグ、プログラムのクラッシュなど、異常終了するたびにメモリリークが発生します。

于 2009-09-01T07:52:33.693 に答える
1
  1. molloc()の代わりに頻繁に電話をかけていますmalloc()。母音を確認してください。
  2. 間違った数の引数で呼び出しmalloc()ています-たった1つしかかかりません。
  3. 文字列を割り当てることはできません-ポインタの割り当てを実行しますが、これはあなたが望むものではありません。ある文字列の内容を別の文字列にコピーするには、混乱全体に対する宗教的な見方に応じて、strcpy()またはを使用する必要がありstrncpy()ます。memcpy()*cpy()
于 2009-09-01T07:54:08.167 に答える
0

コード行「free(fragment)」を削除します。それはうまくいくでしょう。

于 2009-09-03T08:27:26.730 に答える