2011-07-30 62 views
0

假設後刪除我用我需要使用pthread_mutex_destroy

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

初始化一個互斥體。然後在完成之後,調用pthread_mutex_destroy,是否需要使用

delete m; 

要釋放所有資源?

+0

初始化文件指針通常,您不會動態分配互斥鎖('m')。互斥體通常是一個對象。您傳遞對象的地址,以便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

我意外地發現我問了這樣一個基本問題,並沒有接受三年前的正確答案*。也許我有失憶症? –

2

初始化是不同的方面;併爲對象分配內存(類型爲pthread_mutex_t)是不同的方面。使用初始化某些庫的例程與爲堆或堆棧分配內存不同。這就像有一個FILE *作爲局部變量,並使用fopen