检测内存泄漏的简单方法是使用定义如下的DEBUG_NEW宏
#ifdef _DEBUG
#define new DEBUG_NEW
#define DEBUG_NEW new(__FILE__, __LINE__)
#endif
我找到了一个函数operator new,它的定义如下:
void* __cdecl operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
这里的new(size_t nSize, LPCSTR lpszFileName, int nLine
)如何替换new(__FILE__, __LINE__)
呢?
谁能解释一下这个宏定义是如何工作的?
最佳答案
C++ 语言禁止定义名称在词法上与关键字相同的任何宏。由于 new
是关键字,因此禁止定义名为 new
的宏。您的编译器可能会拒绝具有此类宏定义的程序,或者您的程序可能会在编译时或运行时出现意外行为。
因此,让我们考虑一个使用相同宏技巧的格式良好的替代方案:
#define my_new DEBUG_NEW
#define DEBUG_NEW my_new(__FILE__, __LINE__)
这些宏依赖于宏替换是非递归的这一事实。让我们考虑一个 my_new
的使用示例:
my_new T;
首先,my_new
被识别为宏,并被其替换列表 DEBUG_NEW
替换。然后重新扫描替换列表以查找要替换的其他宏。 DEBUG_NEW
被识别为宏,并被其替换列表 my_new(__FILE__, __LINE__)
替换。
此时对原来的my_new
的替换还在评估中,所以替换列表中my_new
的新实例并没有再次被宏替换,所以它保留为 my_new
。这确保在宏替换期间没有递归(或无限递归)的机会。 __FILE__
和 __LINE__
被识别为宏,并被适当的值替换,最终结果为:
my_new("clyde.cpp", 42) T;
关于c++ - 宏定义如何用于内存泄漏检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20296001/