[英]redefine __LINE__ and __FILE__ constants
我正在為c ++制作內存泄漏檢測器。 它替換了全局new運算符,並使用宏來初始化兩個全局變量__file__
和__line__
,如下所示:
#define new (__file__=__FILE__,__line__=__LINE__) && 0 ? NULL : new
我從另一個名字我不記得的StackOverflow用戶那里學到了這個技巧。 這適用於涉及new的簡單操作,但是當用戶為命名空間定義新的本地運算符時,此appraoch會導致問題。 一方面,線條像
void* operator new(size_t size);
也與宏相匹配; 同樣,顯式調用全局new,如:
int* i = ::new int;
導致語法錯誤。
有沒有辦法在部分代碼中重新定義或抑制__LINE__
和__FILE__
常量(以便它們顯示對operator new的調用的文件名和行號)? 如果沒有,如何改進宏以不匹配用戶定義的“operator new”並且不會導致“:: new”出現問題?
我真的很想擺脫宏的怪癖。 提前致謝 :)
我知道沒辦法這樣做非侵入性的。 在過去,我使用了正則表達式或c ++函數替換工具(如Visual Studio中可用的重構工具)來更改new
所有實例,以顯式調用記錄文件和行號的宏。
另一個選擇是檢測內存系統以記錄堆棧幀。 此方法具有較高的運行時成本,但如果由於濫用經常使用的庫代碼而發生的分配發生泄漏,則偶爾會有用。 沒有平台無關的方法來執行此操作,請參閱此問題以獲取適用於常見平台(Linux和Windows)的信息。
編輯:對於您的特定情況,您可以取消定義宏並在導致問題的new
標識符的實例后重新定義它。
好吧,我已經放棄了嘗試讓宏工作。 從它的外觀來看,它不可能。 我寫了一個perl腳本來完成這項工作。 它在預處理(預處理器)之前運行,並且它比C預處理器做的更聰明。 這些是用於將new和:: new匹配到其他內容的正則表達式:
$this =~ s/(::)?\s*new([^\w_])/__fl_init(__FILE__,__LINE__)?NULL: $1new$2/g;
我不知道,也許我會寫一個批處理文件來自動預處理源代碼。 如果有人知道使用CPP的解決方法,請發表評論。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.