2011-12-02 29 views
0

對不起,標題,但希望說明更清晰。運營商新已定義在自定義內存管理器庫

在momemnt我有一個與其他庫(如libpng,libvorbis等)一起構建的主應用程序。我試圖添加libtheoraplayer到主應用程序,但我一直遇到問題:

1)鏈接到一個預構建的libib庫,幷包括適當的頭文件給我一個錯誤,說pushMemoryManager無法找到(我們的自定義內存管理器的一部分)

2)與主應用程序一起構建庫導致鏈接器錯誤「error LNK2005:」void * __cdecl operator new(unsigned int,void *)「(?? 2 @ YAPAXIPAX @ Z)已經在win32Mem.obj中定義了「

我不太確定從哪裏開始調試。主應用程序不支持STL,我開始將libtheoraplayer中對STL的引用更改爲我們自己的STL替換,但在查找有問題的文件並更改它們之後,我仍然收到錯誤2。

任何狂野的想法?

+2

替換標準庫(如果只有STL的一部分)是愚蠢的,除非你有一個很好的理由。 –

+0

有一個很好的理由來取代STL。較早版本的Microsoft STL吸引了大量時間,STL的一些組件仍然存在。但是,替換它們的分配器幾乎是不可能的。 –

回答

0

/FORCE使鏈接器錯誤(轉換爲警告)靜音,並祈禱沒有使用不同分配器的交叉庫分配結束。

這是相當困難的在Windows(NT或CE)替換分配的功能,這是因爲:

  1. 動態符號從特定的庫加載的,所以你會更換分配器在你的代碼中使用,但不用於您動態鏈接的庫中。如果你沒有動態鏈接,並且用/FORCE將鏈接器錯誤消除,它會做正確的事情,並從標準庫中重寫分配器就好了。

    如果生活在一個庫中的代碼分配並且生活在另一個庫中的代碼釋放,則動態鏈接將會在使用的分配器中產生不匹配,從而可能導致崩潰。不幸的是,即使兩個函數是由同一個庫定義的,但它們中的一個是模板(因此實例存在於引用它的庫中),另一個不是(因此它存在於定義它的庫中) 。

  2. 他們有一些非標準的分配器入口點,有時從其他代碼使用它們。我們使用duma庫,實際上設法覆蓋C(malloc/realloc/free)和C++(operator new和operator delete)分配器,但是當我們開始使用iostream時,免費提供類似__debug_free或其他方式。

在一個側面說明,同樣是在Linux上絕對是微不足道的,因爲在GNU libc中的malloc,realloc的和免費電話通過指針真正分配器,你可以很容易地覆蓋(operator new和delete操作符只是調用malloc並基本上分別免費)。

+0

感謝您的洞察,但我們決定手動梳理源代碼,並用我們自己的替換替換std :: list,std :: map和std :: vector :( – StrangeCode