我目前正在檢查一些代碼,我有內存泄漏,這種可能性讓我感到震驚。基本上,我在做什麼的僞代碼如下所示,線程分配內存,主進程死亡,會發生什麼?
void thread_func()
{
char *fileName = malloc(someSize);
/* Do something with fileName and other things */
/* Enter a critical section */
modify some global variables
/*Exit critical section */
free(fileName);
return;
}
此函數駐留在DLL中。關鍵部分和其他東西由同樣駐留在同一個DLL中的函數初始化。
現在,我的主進程(這是一個GUI)有一個取消按鈕。當用戶點擊該按鈕時,我會調用DLL的清理函數,這個函數恰好會破壞我的關鍵部分。
我發現如果用戶在執行thread_func()
期間點擊取消,thread_func()
將繼續執行。當它到達關鍵部分代碼時,關鍵部分是無效的,所以我在那裏退出。這是我如何檢查線程內的取消事件(因爲在執行thread_func()
期間,我的應用程序中沒有其他任何東西可以調用DLL的清除)。
我不能免費fileName
在thread_func()
當我發現臨界區無效。我的猜測是因爲thread_func()
由於主進程退出而失去對fileName
的訪問。我的猜測是對的嗎?我的主要問題是,如果我在這種情況下沒有免費使用fileName
,我是否會冒內存泄漏的風險?
我已經搜索了很多相關信息,到目前爲止還沒有找到任何東西。如果有人能指出我正確的方向/回答我的問題,我會非常高興。
謝謝!
編輯:
,我決定做根據科爾的建議的一些初步測試(見下面的回答)。我注意到了一些我無法理解的奇怪東西。現在,我的代碼如下:
void thread_func()
{
char *fileName = malloc(someSize);
/* Do something with fileName and other things */
if(threadTerminated)
{
/* Cleanup */
return;
}
/* Enter a critical section */
modify some global variables
/*Exit critical section */
free(fileName);
return;
}
而在我的GUI,我OnCancel事件處理程序是這樣的:
void OnCancel()
{
threadTerminated = TRUE;
WaitForMultipleObjects(noOfRunningThreads, threadHandles, TRUE, INFINITE);
/* Other cleanup code */
}
我注意到,WaitForMultipleObjects()
無限期掛起我的圖形用戶界面變得無法響應。 WaitForMultipleObjects()
不應該快速返回?另外,如果threadTerminated
是TRUE
,則在thread_func()
中沒有發生清理。
這是IMO最奇怪的部分。當我刪除WaitForMultipleObjects()
時,我的代碼工作得很好!所有的清理工作都會發生,包括thread_func()
內的清理。有人能幫我理解嗎?
請注意,我現在只在一個點上檢查threadTerminated
。稍後我會在其他重要的部分檢查它。我只是爲了看看我是否瞭解發生了什麼。
再次感謝!你的回答非常有幫助。
有不同類型的內存泄漏,在不增加它往往是更不方便的不是一個實際的問題,因爲程序終止反正和泄漏是不隨時間增長泄漏的情況。 – 2013-02-13 15:12:14
@claptrap,好點!但是我想清除任何我發現的內存泄漏情況。 – 2013-02-13 16:06:37
如果僅在進程退出時調用DLL的清理函數,則不要打擾銷燬關鍵部分。該建築正在拆除,所以你不需要掃地。如果您需要處理DLL被卸載但進程將繼續進行的情況,那麼您需要根據現有答案將清理與線程同步。請記住,即使在沒有關鍵部分的情況下,當線程仍在運行代碼時,也無法安全地卸載DLL。 – 2013-02-13 22:07:15