dll內申請的記憶體可以由呼叫它的程式釋放嗎?
一般是哪裡申請哪裡釋放,誰申請的記憶體由誰釋放,這是封裝的基本原則。
dll內部(對外隱藏)的記憶體分配,顯然要dll自己處理啦。當然也可以由呼叫它的程式釋放, 但不推薦,高內聚,且不安全
dll外部的由外部程式分配後傳進dll,使用完後,可以由外部程式釋放,也可以呼叫dll內部函式幫助釋放。
如果匯出的是類,則可以在類中定義自我是釋放的Release匯出函式:
void release()
{
delete this;
}
COM的記憶體釋放就是採用這樣的方法
[ 知識點 ]
選摘 << WINDOWS核心程式設計>> 第19章 dll基礎
建立dll常常比建立應用程式更容易,因為dll往往包含一組應用程式可以使用的自主函
數。在dll中通常沒有用來處理訊息迴圈或建立視窗的支援程式碼。dll只是一組原始碼模組,
每個模組包含了應用程式(可執行檔案)或另一個dll將要呼叫的一組函式。當所有原始碼文
件編譯後,它們就像應用程式的可執行檔案那樣被連結程式所連結。但是,對於一個dll來說,
你必須設定該連鏈程式的/ dll開關。這個開關使得連結程式能夠向產生的dll檔案映像發出
稍有不同的資訊,這樣,作業系統載入程式就能將該檔案映像視為一個dll而不是應用程式。
在應用程式(或另一個dll)能夠呼叫dll中的函式之前,dll檔案映像必須被對映到調
用程式的地址空間中。若要進行這項操作,可以使用兩種方法中的一種,即載入時的隱含連結
或執行期的顯式連結。
一旦dll的檔案映像被對映到呼叫程式的地址空間中, dll的函式就可以供程式中執行的
所有執行緒使用。實際上, dll幾乎將失去它作為dll的全部特徵。對於程式中的執行緒來說,
dll的程式碼和資料看上去就像恰巧是在程式的地址空間中的額外程式碼和資料一樣。當一個執行緒
呼叫dll函式時,該dll函式要檢視執行緒的堆疊,以便檢索它傳遞的引數,並將執行緒的堆疊用
於它需要的任何區域性變數。此外, dll中函式的程式碼建立的任何物件均由呼叫執行緒所擁有,而
dll本身從來不擁有任何東西。
例如,如果VirtualAlloc函式被dll中的一個函式呼叫,那麼將從呼叫執行緒的程式地址空間
中保留一個地址空間的區域,該地址空間區域將始終處於保留狀態,因為系統並不跟蹤dll中
的函式保留該區域的情況。保留區域由程式所擁有,只有線上程呼叫VirtualFree函式或者程式
終止執行時才被釋放。
相關文章
- C++ - 二級指標動態記憶體申請與釋放C++指標記憶體
- vector 的記憶體釋放記憶體
- tracemalloc庫追蹤程式碼申請的記憶體大小記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- 內網IP地址可以申請SSL證書嗎?內網
- XCode釋放記憶體XCode記憶體
- 撥開由問題《Linux下malloc最大可申請的記憶體》帶來的重重疑雲Linux記憶體
- 如何主動釋放 HeapIdle 的記憶體API記憶體
- golang 釋放記憶體機制的探索Golang記憶體
- 誰建立誰銷燬,誰分配誰釋放——JNI呼叫時的記憶體管理記憶體
- .Net記憶體管理釋放的兩種方式記憶體
- Vector() 記憶體釋放 不得不說的故事記憶體
- C++ vector 釋放記憶體的兩種方法C++記憶體
- 沒有解析的域名可以申請SSL證書嗎
- 未備案的域名可以申請ssl證書嗎?
- C# 垃圾回收釋放記憶體C#記憶體
- 在 4GB 實體記憶體的機器上,申請 8G 記憶體會怎麼樣?記憶體
- C/C++記憶體分配以及釋放C++記憶體
- vector clear() 方法 記憶體釋放問題記憶體
- .NET 記憶體管理兩種有效的資源釋放方式記憶體
- 【C++】 外傳篇 3_動態記憶體申請的結果C++記憶體
- ASP.NET Core 8 的記憶體佔用可以更低嗎?ASP.NET記憶體
- 相機記憶體卡的照片刪除了可以恢復嗎?記憶體
- 請描述C/C++程式的記憶體分割槽?C++記憶體
- SSL證書可以使用中文域名申請嗎
- 怎麼手動在rstudio中釋放記憶體?記憶體
- Linux系統手動釋放記憶體快取Linux記憶體快取
- C/C++使用malloc為結構體陣列分配記憶體(及free釋放記憶體)的三種方法C++結構體陣列記憶體
- Chrome 再次最佳化記憶體佔用問題,新增記憶體釋放開關Chrome記憶體
- win10為硬體保留的記憶體怎麼釋放 win10取消為硬體保留的記憶體怎麼操作Win10記憶體
- 程式的記憶體模型記憶體模型
- 如何在Mac上釋放記憶體?Mac清除RAM教程Mac記憶體
- linux結束處於Tl狀態的程序,釋放記憶體資源Linux記憶體
- redis的記憶體滿了之後,redis如何回收記憶體嗎Redis記憶體
- win10如何設定自動釋放記憶體_win10怎麼設定自動清理系統垃圾釋放記憶體Win10記憶體
- 用pprof分析map和slice的記憶體呼叫記憶體
- Steam版《A.V.A 戰地之王》內測申請正式開放!
- golang的記憶體相關內容Golang記憶體