2012-10-10 33 views
6

Microsoft運行時庫提供調試版本的分配函數。對於C++中,這是新的與簽名操作者的調試變體:使用調試版本覆蓋新版本而不損壞位置新增

void *operator new(size_t size, int blockType, const char *filename, int linenumber); 

和宏的定義如下

#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 

我們儀器所有的分配,一個通常定義

#if defined DEBUG_NEW 
#define new DEBUG_NEW 
#endif 

然而,這個定義打破了使用放置新的任何地方,因爲這兩組參數最終成爲語法錯誤。現在,我可以輕鬆處理我們代碼中的少數用途,但標準庫和增強功能使用全新的位置。因此,定義全局意味着在定義之前包含許多內容,並且會減慢編譯速度。

那麼有沒有什麼辦法可以在我們的代碼中分配代碼,而不必因爲它們包含新的位置並且不必將所有文件中的最後一個定義放在所有文件中,或者手動編寫DEBUG_NEW而無需拉入頭文件?

回答

0

這整個DEBUG_NEW東西應該在火死了!它只有很少用處,並且在現代C++中根本沒有用處,因爲你不再看到C++中的new

有更好的選擇,如杜馬,現在有Dr. Memory(其工作原理類似於Valgrind,但在Windows上),使用DEBUG_NEW可憎是絕對沒有意義的。

3

我已經在歷史上解決了這個的方法是使用預編譯頭,並且做這樣的事情(StdAfx.h中,Pch.h,PreCompiled.h或其他):

//First include all headers using placement new 
#include <boost/tuple/tuple.hpp> 
#include <vector> 

#define new MY_NEW 
#define MY_NEW new(__FILE__, __LINE__) 

並確保沒有文件直接包含boost頭文件,而只包含預編譯頭文件。

+0

在我們的情況下,預編譯頭文件將非常難以維護。由於各種可移植性問題,它們將非常龐大而複雜(代碼庫針對4種不同的平臺編譯)。 –

+0

他們難以維護的方式是什麼? pch應該很少改變。 –

+0

如果它包含了提升內容,它會經常改變。但也許我應該嘗試預編譯這個內存調試頭(用'/ Fi'編譯器選項注入);新的位置出現在相當少的地方。 –

-1

define new DEBUG_NEW行應該放在一個源文件中,畢竟是#include行。通過這種方式,它僅適用於您自己的代碼,而不適用於任何其他h文件,如Boost。全新的DEBUG_NEW重新定義可能會導致編譯失敗,應該避免。

+0

你是對的,除非你明白,這個問題是明確的**沒有做**。 –

+0

沒有閱讀答案的投票的好例子。 –

5
#pragma push_macro("new") 
#undef new 

new(pointer) my_class_t(arg1, arg2); 

#pragma pop_macro("new") 

#pragma push_macro("new") 
#undef new 

#include <...> 
#include <...> 
#include <...> 

#pragma pop_macro("new") 
+0

描述'push_macro()'和'pop_macro()'是如何工作的將會很有幫助。比如,在'pop_macro(「new」)'後恢復原來的'new'。 – cpburnz

0

我知道這是有點晚了,但這個問題可以通過使用模板魔法來解決。

我最近編寫了一個debug_new調試器,它添加了一個新的關鍵詞「placement」,它被寫入所有展示位置的新調用的infront。

您可以在這裏看看我的調試器:https://sourceforge.net/projects/debugnew/

或者從女媧的DEBUG_NEW調試這裏:https://sourceforge.net/projects/nvwa/

+0

你能否介紹一下它的工作原理和原理? –