c++ - 宏定义如何用于内存泄漏检测?

标签 c++ memory macros memory-leaks

检测内存泄漏的简单方法是使用定义如下的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/

相关文章:

c++ - 为 float 配置 std::ofstream 格式

java - Android:释放引用后内存未释放

c - 长度宏的问题

c++ - 使用 C++ AMP 库

c++ - <cstring> 中的方法是否也适用于字符串类?

c++ - 为什么我不能在 if 循环中使用动态变量?

python - Python 中用于 SQLite 的 Connection.iterdump 的替代方案?

c - 是否有 libc 函数(或等效函数)可以知道堆的当前大小?

c++ - 这个C++宏是什么意思?

任何人都可以解释输出