2010-10-31 45 views
4

我有一個與某些DLL(或.so's)鏈接的測試應用程序。在我的主要應用程序,我定義的全球新/刪除這樣的:我該如何讓我的依賴項調用我的全局運算符new?

void* operator new(size_t n) 
{ 
    .... 
} 

void operator delete(void* p) 
{ 
    ... 
} 

不過我注意到,運營商只要求我的東西在我的主要的應用程序分配,但如果這些DLL之一呢。

如何在DLL中進行分配通過我的操作員new/delete? (這也應該包括由STL分配的內存,所以如果其中一個DLL有一個std :: string,我希望我的操作符new在STL分配它的std :: string內部緩衝區時被調用)。

我對Windows解決方案更感興趣,但Linux的一個也將不勝感激。

編輯:也許我最初並不清楚,這個測試應用程序是爲了跟蹤在DLL中定義的一些自動生成的類的內存使用情況。創建我自己的分配器並在生成的代碼中使用STL結構不是一種選擇,更重要的是還有其他非STL分配。但看到答案,我認爲最好的選擇是使用分析器或者只是使用perfmon監視內存使用情況。

回答

2

我想我的新的運營商時要調用STL分配它的std :: string內部緩衝區

typedef std::basic_string<char, std::char_traits<char>, ALLOCATOR> mystring;

在DLL中的代碼已經使用自己的new落實,沒有很好的理由說明爲什麼定義自己的實現應該奇蹟般地改變DLL使用的實現(如果他們使用自己的自定義實現呢?)。

所以,如果你想讓字符串使用你的分配器,你需要明確地創建它們。

+0

我們可以跟蹤您提到的方式跟蹤STL分配嗎?如何使用mystring?它不會調用我自己的新東西:( – bjskishore123 2010-10-31 07:22:03

+0

@ bjskishore123 - 使用你可以跟蹤STL的分配情況,除了用你自己的分配器實現來替換ALLOCATOR外,你可以使用'mystring'類似'std :: string'。 – 2010-10-31 07:23:34

+0

雖然你的答案在技術上是正確的,但它並不能真正幫助我,更重要的是,這些DLL是我的 - 它們沒有自己的'new'實現,我可以重新編譯它們以使用測試應用程序中的那個 - 如果我知道如何 – Zack 2010-10-31 08:20:53

1

任何旨在使用您的全局定義的東西都必須使用可用的定義進行編譯。您使用的技術不會覆蓋任何已經在DLL或甚至不包含這些定義的其他源文件中編譯的任何東西。在很多情況下,即使可見,分配器和標準函數也不會使用這些函數。

如果你真的需要這樣做,你將不得不攔截對malloc(和其他分配例程)的調用。這並不容易。你不能簡單地從代碼中完成。你必須告訴鏈接器如何做到這一點。在Linux上,我認爲這是LD_PRELOAD,雖然我不記得了,在Windows上我也不確定。

如果你可以指出你爲什麼想這樣做,也許我可以提供一個替代解決方案。

+0

感謝,看我編輯更多信息 – Zack 2010-10-31 08:19:01

+0

是的,一個分析器將是你最好的選擇。看看Linux上的valgrind。 – 2010-10-31 09:01:59

1

沒有辦法完全做你想做的事情。存儲器泄漏的角落案例太多。

我認爲你可以得到的最接近的是通過執行以下操作: 你的dll/.so中的每個類都必須有一個靜態的工廠/銷燬方法。將指向分配函數的指針傳遞給工廠,並將釋放函數傳遞給每個dll/.so中的每個類中的destroy方法。

關於如何關閉的例子,谷歌的HORDE內存分配庫,它確實關閉。

另一個要看的是各種C++類插件庫,允許您加載任何dll /。作爲一個插件。上次我檢查的時候,至少有10個這樣的圖書館在谷歌地圖上有源代碼。 :)

相關問題