2011-08-06 10 views
2

これに対して非常に混乱します。私はちょうどポインタについて学び始めて、少し深めてスレッドを試してみることに決めました。私は何をしようとしていることは、スレッドへのポインタを渡しているので、(dataをINGのmalloc後)私が呼ん:newClient関数の内部空きスレッドが原因でセグメンテーションエラーが発生する

pthread_create(&ptThread, &ptAttr, newClient, (void *) data); 

、と(私は何をする必要があるかやる、と私が決めました割り当てられたポインタはそれを解放すること)があった:

void *newClient(void *v) { 
    // ...stuff happens here... 

    free(v); 
} 

free(v);部には、私は、セグメンテーションフォールトを取得します。だから私はvalgrindのを使用して、私はこれが無効無料だったと言ってしまった:

==1214== Invalid free()/delete/delete[] 
==1214== at 0x4023B6A: free (vg_replace_malloc.c:366) 
==1214== by 0x804F622: newClient (xxxxxx2.c:44) 
==1214== by 0x4032954: start_thread (pthread_create.c:300) 
==1214== by 0x4112E7D: clone (clone.S:130) 
==1214== Address 0x4 is not stack'd, malloc'd or (recently) free'd 

私は私のプログラムを終了すると、火災に追加するには、valgrindのは「vfreeなかったので、私はメモリリークを持っていた私に言いましたd:

==1214== 8 bytes in 2 blocks are definitely lost in loss record 1 of 1 
==1214== at 0x4023F50: malloc (vg_replace_malloc.c:236) 
==1214== by 0x804F453: main (xxxxxx1.c:94) 

私の質問 - どのように無料の無料ですか?私がここで紛失しているものはありますか? free(v);する必要がありますか?

+0

は 'data'単純ポインタですか?変数の定義とmallocをコードの関連部分に記述してください。 –

+0

コードは不十分ですが、* data *はmalloc()で割り当てたポインタのようには見えません。そうだったら、あなたはvoid * castを使わなかったでしょう。割り当てられていないものをfree()しないでください。 –

答えて

6

まず、0x4は有効なアドレスのようには見えません。私は何が起こっていると思う何

==1214== Address 0x4 is not stack'd, malloc'd or (recently) free'd 

は、あなたが誤ってvを変更しているということです。これは、memcpy/strcpyが重複してnewClientのスタックを上書きしていることが原因である可能性があります。

一般に、mallocfreeの両方を同じスレッドで実行することをお勧めします。私はいくつかのアロケータがそれをより効率的に行うように設計されていると聞きました。

+0

同じスレッドで 'malloc' /' free'が発生すると、多くのアロケータがより効率的になりますが、スレッドによる動的割り当ての重要な用途の多くは、実際には排除します... –

0

おそらく問題は既にあなたのところにあるmallocあなたのdataです。それは間違って(0x4は妥当ではない)過去を過ごすので、おそらくあなたはすでに問題を抱えていたでしょう。一般的なエラーは、ヘッダーファイルをインクルードすることを忘れて、mallocをデフォルト規則ごとにintを返すように解釈することです。ほとんど常にキャスティング

はプログラミングや、悪化し、設計エラーを非表示にします。

  • mallocの戻り値をキャストしないでください。 malloc戻りvoid* これはあなたがpthread_createを呼んでくださいときのよう
  • void*へのポインタをキャストしていない他のデータ型のポインタと互換性があります。すべてのデータ型ポインタは、問題なくvoid*に変換されます。
関連する問題