鑑於:可執行文件使用dll。他們有不同的c/C++運行時。它們之間的界面中存在哪些限制? 除了它們使用相同的編譯器,相同的Boost版本(但不同的預編譯boost庫)。exe與dll之間的接口與不同的C/C++運行時庫
我知道不同的運行時可以有不同的堆。所以,刪除必須對應新的來自同一堆。
最重要的是,我們不能通過接口STL對象傳遞,因爲當我們構建EXE STL對象鏈接到一個運行時 和建立dll相同的對象(如果我們通過引用傳遞它或通過接口複製)將鏈接另一個運行時 而另一個運行時可以對該對象有不同的實現。
讓我們考慮的情況:
我認爲以下是安全的。 Dll導出函數,它具有參數:對包含專用STL類作爲成員的導出的用戶定義類的引用。 Dll爲這個對象分配內存。 Exe調用此對象的發佈方法,當想要刪除它時。
我覺得以下是不安全的。用戶定義的類在exe中實例化並通過exe/dll接口傳遞。 該類包含專用STL類作爲成員。 exe和dll共享此用戶類的頭文件/實現文件。 當這個類被構建在不同的項目中時,將使用不同的STL實現。例如,string :: size()(來自不同運行時)的不同實現 將應用於內存中的同一對象。
我認爲以下是安全的。用戶定義的類在exe中實例化並通過exe/dll接口傳遞。 該類不依賴於標準庫,它只使用原始C++類型。 exe和dll共享此用戶類的頭文件/實現文件。 另外我們必須控制那個新的和刪除對應的相同的堆。例如,我們可以重載new/delete,使它們使用:: GetProcessHeap。
我認爲以下是不安全的:通過exe/dll接口傳遞boost對象,因爲它們可以依賴於標準庫類。另外刪除可能不對應新的堆。
我認爲以下是不安全的:即使我們通過exe/dll接口傳遞boost對象,並且它們不依賴於標準庫類但不能實現爲標頭 - 只能通過一個boost來創建對象lib(用於一個運行時),並與另一個boost lib(用於另一個運行時)一起使用。另外刪除可能不對應新的堆。
另外我想使用一些智能指針的味道從EXE到DLL以及從DLL到EXE傳遞對象的引用(在第3項中提到)。 我認爲這個智能指針還應該重載new/delete來從默認進程堆中分配引用計數器。 當它會嘗試刪除尖銳的物體,它會調用刪除此對象重載(如在項目3)
對於從第1項我想使用自定義的智能指針,它將調用尖銳物體 的釋放方法的對象(如boost :: shared_ptr自定義版本)
哪些問題沒有提及?請糾正我。