FMD开发文集 -- MFC调试模式下new操作符的特殊处理
作者:冯明德
一、在调试模式下,new操作符号通过宏定义转换成了调试版本。
在文件头经常可以发现以下语句:
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
其中,将new定义为DEBUG_NEW
二、DEBUG_NEW的处理
调试版本的new操作函数:void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
宏替换:#define DEBUG_NEW new(THIS_FILE, __LINE__) //文件名、行号被传入,供调试输出。
实际代码如下:
void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
return ::operator new(nSize, _NORMAL_BLOCK, lpszFileName, nLine);
}
//分配内存
void* __cdecl operator new(size_t nSize, int nType, LPCSTR lpszFileName, int nLine)
{
#ifdef _AFX_NO_DEBUG_CRT
UNUSED_ALWAYS(nType);
UNUSED_ALWAYS(lpszFileName);
UNUSED_ALWAYS(nLine);
return ::operator new(nSize);
#else
void* pResult;
#ifdef _AFXDLL
_PNH pfnNewHandler = _pfnUninitialized;
#endif
for (;;)
{
pResult = _malloc_dbg(nSize, nType, lpszFileName, nLine);
if (pResult != NULL)
return pResult;
#ifdef _AFXDLL
if (pfnNewHandler == _pfnUninitialized)
{
AFX_MODULE_THREAD_STATE* pState = AfxGetModuleThreadState();
pfnNewHandler = pState-> m_pfnNewHandler;
}
if (pfnNewHandler == NULL || (*pfnNewHandler)(nSize) == 0)
break;
#else
if (_afxNewHandler == NULL || (*_afxNewHandler)(nSize) == 0)
break;
#endif
}
return pResult;
#endif
}
#endif //_DEBUG
(全文完)
分享到:
相关推荐
1. **内存泄漏检测**: MFC在调试模式下提供了一种内存泄漏检测机制。当程序结束时,如果存在未释放的内存,MFC会报告内存泄漏的详细信息。 2. **afxTraceMemory**: MFC提供了一个全局函数`afxTraceMemory`,用于在...
`DEBUG_NEW` 是一个宏,用于替换标准的 `new` 操作符。在调试模式下,它记录分配内存的文件名和行号,便于调试时追踪内存泄漏。在发布版本中,`DEBUG_NEW` 将还原为标准的 `new` 操作,不产生额外的调试信息。 8. ...
10.1.2 C++的new 和 delete操作符 204 10.2 调试手段 204 10.2.1 C运行库提供和支持的调试功能 204 10.2.2 MFC提供的调试手段 205 10.2.3 内存诊断 208 第11章 MFC下的文件类 210 11.1 文件操作的方法 210 11.2 MFC...
CNoTrackObject类还提供了调试版本的new操作符,允许在调试模式下指定分配内存的位置和大小,方便调试时追踪内存分配情况。而AFX_MODULE_STATE类则包含了一些全局数据,如模块是否为DLL、默认窗口过程以及版本信息等...
10.1.2 C++的new 和 delete操作符 204 10.2 调试手段 204 10.2.1 C运行库提供和支持的调试功能 204 10.2.2 MFC提供的调试手段 205 10.2.3 内存诊断 208 第11章 MFC下的文件类 210 11.1 文件操作的方法 210 11.2 MFC...
- **对象创建与销毁过程**:如何通过new和delete操作符管理内存,以及析构函数的作用。 - **消息处理**:从WM_CREATE到WM_DESTROY,MFC是如何处理各种Windows消息的。 - **事件驱动编程**:如何通过消息映射实现用户...
8. **内存管理**:C++允许直接管理内存,因此在处理大量数据或动态分配对象时,需要正确地使用new和delete操作符,避免内存泄漏。 9. **代码组织**:良好的代码结构和设计模式(如单例模式、工厂模式)可以使代码更...
6. **动态内存管理**:学习new/delete操作符,掌握堆区内存的申请和释放方法。 7. **异常处理**:了解try-catch-finally机制,能够正确地处理运行时错误。 ### 二、MFC基础入门 在具备了一定的C/C++基础之后,可以...
- `DEBUG_NEW`:在调试模式下,`DEBUG_NEW`宏会在每次调用`new`操作符时插入额外的代码,以便跟踪内存分配的情况,这对于发现内存泄漏等问题非常有帮助。 - `BEGIN_MESSAGE_MAP(theclass, baseclass)`:与`DECLARE_...
MFC提供了`CObject`基类,它是所有MFC类的基类,包含了一些基础的内存管理功能,如`new`和`delete`操作符的重载,以支持对象的动态分配和释放。 在压缩包的子文件名“C++上位机”中,"上位机"通常指的是在控制系统...
文档/视图体系结构是MFC中常用的设计模式之一,它将数据和界面分离开来,提高了程序的可维护性和可扩展性。 - **4.5 MFC消息映射机制** MFC通过消息映射机制来处理窗口消息,使得开发者无需直接与Windows API交互...
- `new DEBUG_NEW`:在调试模式下,替换`new`操作符,以跟踪内存分配和释放。 - `THIS_FILE`:用于存储当前文件的路径,以便在调试时定位错误。 3. 消息映射(Message Map): - `BEGIN_MESSAGE_MAP` 和 `END_...
`#define new DEBUG_NEW`则是在调试模式下使用特殊的new操作符,以便于内存泄漏检测。 ### 6. 字符串处理 虽然在给定的部分代码中没有直接出现字符串处理的逻辑,但`#include "string"`表明代码可能涉及到对字符串...
在C++中,程序员需要手动管理内存,即通过`new`操作符分配内存,通过`delete`或`delete[]`操作符释放内存。一旦忘记释放不再使用的内存,就会导致内存泄漏。 #### 三、VC++下的内存泄漏检测机制 在VC++中,内存...
- `DEBUG_NEW`宏被定义在调试模式下,用于替代`new`操作符,以便跟踪内存分配的问题。 - `#ifdef DEBUG`和`#endif`是预处理指令,用于在编译时检查是否定义了`DEBUG`符号,通常用于调试版本的代码。 7. **C++的类...
* 使用`DEBUG_NEW`宏来定义调试模式下的新操作符。 * 使用`THIS_FILE`宏来定义当前文件的名称。 该计算器代码展示了C++编程语言的基本结构和技术,包括类的定义、消息映射、头文件的使用等方面。
CDumpContext重载了`操作符,使得我们可以像操作流一样方便地输出调试信息。预声明的全局对象afxDump是CDumpContext的一个实例,仅在MFC的Debug版本中可用,用于将调试信息输出到调试输出窗口或调试终端。例如: ``...
2. **内存管理**:理解栈和堆的概念,以及如何使用new和delete操作符进行动态内存分配和释放。 3. **标准库**:熟悉C++标准库,如iostream用于输入输出,vector和array用于动态数组,string处理字符串等。 4. **...
- 修改`new`运算符的方式是在编译器预处理器中定义一个新的`new`操作符,该操作符不仅分配内存,还记录了分配内存的位置(文件名和行号)。这样,在生成的内存泄漏报告中就会包含这些信息。 #### 四、高级内存泄漏...