我知道在一個dll中創建的內存分配隨後在另一個dll中釋放會導致各種問題,特別是在CRT方面。當涉及到導出STL容器時,這些問題尤其成問題。我們已經經歷了這些各種各樣的問題之前(編寫與我們的庫鏈接自定義Adobe插件時),我們已經定義了自己的分配器,我們在我們所有的容器使用,例如,工作就是圍繞着這些問題:跨dll邊界的內存分配和釋放
typedef std::vector < SessionFields,
OurAllocator <SessionFields> >
VectorSessionFields;
typedef std::set < SessionFields,
std::less <SessionFields>,
OurAllocator <SessionFields> >
SetSessionFields;
將代碼傳入/傳出時,這種方法運行良好,但是我們遇到了一個問題,那就是我們現在不得不調用Adobe SDK中的一個函數,它返回一個填充矢量,當它超出範圍時會導致崩潰。
顯然,在我的代碼中最終釋放了內存時,它在Adobe的SDK中分配的內存屬於不同的堆。所以我在想,也許我可以做一些聰明的事情,比如重寫或導出SDK中使用的分配器,這樣我就可以使用它來清理從其函數返回的容器。
我也在看寫封裝或某種形式的thunking層,因此STL容器將安全地編碼在我的代碼和SDK之間(雖然聽起來很雜亂)。
或者,我也在尋找使用GetProcessHeaps
來確定SDK中使用的堆,並嘗試釋放堆而不是默認堆。
有沒有人有任何關於如何解決這個問題的建議?
這是一種非常常見的技術,我也在C中看到它,其中一個庫需要其用戶通過某種庫init()點提供分配/解除分配回調。 – Justin 2009-08-27 23:29:14