2013-06-02 67 views
4

我在Visual Studio 2012中編譯了/ MT(靜態多線程運行時庫)的dll項目。它還鏈接了第三方靜態庫,也用/ MT(庫A)編譯,目前沒有問題。在單個DLL中混合/ MD和/ MT

問題出現在另一個靜態庫(庫B)中,它不幸地用/ MD編譯。在我的DLL中,我需要鏈接兩者,沒有其他選擇(我不能用不同的選項重新編譯它們)。我能夠成功地將所有內容鏈接在一起,但現在我遇到了內存分配和刪除的問題 - 有時它無法刪除分配的對象,有時會出現另一個奇怪的錯誤。我相信這是由我的dll的不同部分使用的混合內存管理函數引起的 - 當調用new時,在庫B中創建對象,但是當調用delete時,它會嘗試使用不同的函數集來釋放內存 - 但是我可能是錯誤的。

所以我的問題是,這是否真的是由混合內存管理功能引起的?如果是這樣,有什麼辦法可以一起完成這項工作嗎?

我認爲唯一的解決方案是將庫B包裝在另一個用/ MD編譯的dll中,然後從原始dll中使用它來確保使用不同的內存管理功能。我不確定,如果這會有幫助,我想避免它。

回答

4

你似乎已經明白,你所看到的問題的原因,它是described on MSDN如下

MSDN screenshot

如果這是真的不可能得到你的所有鏈接庫使用相同的CRT的版本,那麼你唯一可能的選擇是避免在這些模塊的邊界上傳遞CRT對象。無論你是否可以在你的應用程序中執行此操作,wholeley都依賴於你的應用程序。上述文章中的關鍵點就是這句話:

如果你設計你的DLL,以便它傳遞CRT對象跨越邊界或分配內存,並希望它的DLL外面被釋放,你限制DLL用戶使用與DLL相同的CRT庫副本。只有在兩者都與相同版本的CRT DLL鏈接的情況下,DLL及其用戶才使用CRT庫的相同副本。

我知道你說,這是不可能獲得或建立兼容模塊鏈接到你的應用程序,但我會建議您詳盡重溫這一點,並不惜一切代價避免混合不同的CRT庫。

+0

感謝您的回答,我能夠改變項目的設計來分隔內存分配,因此每個lib管理自己的對象。它現在似乎工作,希望我未來不會遇到問題。 – Firielentul