假設後刪除我用我需要使用pthread_mutex_destroy
pthread_mutex_t *m = new pthread_mutex_t;
pthread_mutex_init(m, NULL);
初始化一個互斥體。然後在完成之後,調用pthread_mutex_destroy,是否需要使用
delete m;
要釋放所有資源?
假設後刪除我用我需要使用pthread_mutex_destroy
pthread_mutex_t *m = new pthread_mutex_t;
pthread_mutex_init(m, NULL);
初始化一個互斥體。然後在完成之後,調用pthread_mutex_destroy,是否需要使用
delete m;
要釋放所有資源?
你需要釋放內存,因爲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
我很困惑 - 第一個代碼塊中的代碼是否實際產生了valgrind的輸出? pthread_mutex_t是靜態分配的,那麼內存在哪裏泄漏? –
@WayneUroda不,它不是該代碼的輸出。這是OP代碼的輸出。我只是解釋爲什麼'pthread_mutex_destroy'不能釋放它的參數。 – cnicutar
我意外地發現我問了這樣一個基本問題,並沒有接受三年前的正確答案*。也許我有失憶症? –
初始化是不同的方面;併爲對象分配內存(類型爲pthread_mutex_t
)是不同的方面。使用初始化某些庫的例程與爲堆或堆棧分配內存不同。這就像有一個FILE *作爲局部變量,並使用fopen
初始化文件指針通常,您不會動態分配互斥鎖('m')。互斥體通常是一個對象。您傳遞對象的地址,以便init函數可以正確初始化它。 (這通常意味着動態分配一個對象並將指針放入傳遞的位置(這是othread_mutex_t不透明的原因))。 –