簡體   English   中英

重新定義__LINE__和__FILE__常量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM