1. 程式人生 > >跨模組傳遞C++物件

跨模組傳遞C++物件

       跨模組傳遞C++物件,如果大家共用C++動態庫,沒有關係,因為在呼叫結束,棧上的函式引數析構後清除同一C++庫管理的記憶體,但是如果是靜態連結的C++動態庫,那就麻煩了,會導致申請在一個模組中,釋放在另一個模組中(這塊一會介紹下)。大家用的不是同一個堆記憶體,釋放的記憶體物件就不對了。這種情況下就使用基本型別(int, char, 指標等),這樣就避免了申請和釋放記憶體的問題。

      C++在跨模組呼叫函式時,如果引數是C++類,那麼會在被呼叫方的棧上申請記憶體,但是函式呼叫完畢後,要釋放參數的空間則是使用呼叫方的清除函式,所以就造成了申請和釋放記憶體的不匹配。

      __cdecl呼叫方式(C++預設呼叫方式),引數由呼叫者釋放,所以跨dll傳遞的C++型別引數,棧記憶體是由被呼叫者申請的,但是釋放是由呼叫者來進行,兩個模組如果是動態連結的C++庫,那麼這個沒有問題,因為大家釋放的都是同一個C++執行庫中的堆疊地址,如果不是那就會造成程式錯誤。

      __stdcall呼叫方式,引數由被呼叫者申請記憶體,釋放也是由被呼叫者釋放,所以大家都在同一個C++執行期庫中申請/釋放,所以不會有問題。但是事實在驗證中還是出了問題,函式呼叫不返回。

所以,在跨模組傳遞引數的時候,要不選擇基礎型別,要不就直接傳遞指標(記憶體由呼叫者管理),避免在跨模組造成的記憶體管理問題。另外儘量選擇動態連結到C++執行期庫,這樣記憶體管理更安全。