win7/win10 ,MinGW
現在程式需要一個功能,在某個目錄下(大多數情況下是在程式的目錄下的一個子目錄)
然后這些目錄下可能有一個或多個dll,檔案名不同,但每個.dll檔案里都會有個函式
int foo(int x , int y)
每個.dll的檔案里的函式名都相同,但函式代碼不相同
然后程式在運行時,會根據不同的狀況加載.dll呼叫foo函式,類似這樣
typedef int (*FOO)(int,int);
std::string dllNms = getDevStatus(); //根據設備情況決定加載那個dll
FOO f = loadDll("F/DevDll/"+dllNms); //該函式用于加載dll檔案內的foo()函式
int res = f(devNumbers,devCounts);
然后,就這段代碼而言,在程式運行程序中需要多次執行,f作為一個函式指標,沒有對應的delete,有沒有存在記憶體泄漏的問題
如果有該如何delete?
delete f;
這段代碼MingW編譯器直接報錯
uj5u.com熱心網友回復:
函式指標指向的是一段代碼,又不是資料,不用釋放,要釋放的是那個dll的handleuj5u.com熱心網友回復:
決定要不要釋放的不是看是不是指標,是看是否申請堆記憶體。delete的不是指標,而是指標指向的記憶體。int a = 0;
int *b = &a;
你覺得能delete b?
uj5u.com熱心網友回復:
我就是想問,程式從本地dll中加載一個函式來執行,那執行完成后有沒有必要手動釋放記憶體
還有個問題,因為需要不斷加載dll,而dll檔案不是我們公司的,我們也不知道dll里函式的源代碼,假設dll里的函式有new的操作而沒有對應的delete,那不斷呼叫該dll是否會造成記憶體泄漏,有沒有辦法在在(呼叫dll的)程式端預防該問題?
uj5u.com熱心網友回復:
dll加載大概是如此HANDLE handle = loadliabray(.....);
func = getprocessaddress(....);
func();
closehandle(handle)//要釋放的是這個handle 而不是那個func
另外如果func函式里面有記憶體泄露,因為dll是加載到呼叫行程的,你就算把handle釋放掉,泄漏依然存在。所以要防止泄漏,一個方法是你和對方要協商好,對于函式的回傳值,什么該釋放,什么不該釋放,要有約定。
另一個方法,也是最合適的方法,就是誰new的記憶體,誰負責delete。不是你的,你不要去管。
uj5u.com熱心網友回復:
tks
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/29369.html
標籤:C++ 語言
下一篇:關于宏定義函式宣告的問題。
