2011-07-30 2 views
0

後に削除を使用する必要がありますか、私はミューテックスを初期化するためには私がpthread_mutex_destroyの

pthread_mutex_t *m = new pthread_mutex_t; 
pthread_mutex_init(m, NULL); 

を使用すると仮定します。そして、後に、私は終わりだ、とpthread_mutex_destroyのを起動し、私はすべてのリソースを解放するために

delete m; 

を使用する必要がありますか?

+0

通常、mutexを動的に割り当てません( 'm')。通常、mutexはオブジェクトです。 init関数が正しく初期化できるように、オブジェクトのアドレスを渡します。 (これは通常、オブジェクトを動的に割り当て、渡された場所にポインタを置くことを意味します(othread_mutex_tが不透明な理由があります))。 –

答えて

6

メモリを解放する必要があります。pthread_mutex_destroyのためにメモリを解放する必要があります。

なぜpthread_mutex_destroyがメモリを解放しないのですか?あなたがこれを行うには許可されているので:

pthread_mutex_t m; 
pthread_mutex_init(&m, NULL); 

pthread_mutex_destroy(&m); /* Can't free &m. */ 

あなたはvalgrindを使用して、それを試すことができます:pthread_mutex_initを使用して

==836== LEAK SUMMARY: 
==836== definitely lost: 24 bytes in 1 blocks 
+0

私は混乱しています - 最初のブロックのコードは実際にvalgrindの出力を生成しますか? pthread_mutex_tは静的に割り当てられているので、メモリはどこから漏れていますか? –

+0

@WayneUrodaいいえ、それはそのコードからの出力ではありません。それはOPのコードからの出力です。私は単に 'pthread_mutex_destroy'がそのパラメータを解放できない理由を説明していました。 – cnicutar

+0

私はこのような基本的な質問をしたことがあり、3年前*の正解を受け入れていないことを間違いなく知りました。多分私に記憶喪失があったでしょうか? –

2

ミューテックスの初期化は、異なる側面です。オブジェクト(タイプpthread_mutex_t)に割り当てられたメモリを持つことは、異なる側面です。

使用初期化ライブラリのルーチンは、ヒープ上またはスタック上にメモリを割り当てることとは異なります。 FILE *をローカル変数として使用して、ファイルポインタを初期化するのと同じです。fopen