dll內申請的記憶體可以由呼叫它的程式釋放嗎?

Mobidogs發表於2020-04-04

  一般是哪裡申請哪裡釋放,誰申請的記憶體由誰釋放,這是封裝的基本原則。  
  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函式或者程式  
  終止執行時才被釋放。 

 

相關文章