快速定位内存泄漏的位置
2010-03-23 15:48
525 查看
每次分配内存系统都会分配一个内存序列标志,通过_CrtIsMemoryBlock函数可以获取这个序列标志值以及分配的文件名和行号位置:
int* pNum = (int*)_malloc_dbg(12, _NORMAL_BLOCK, __FILE__, __LINE__);
...
...
...
long lReg = 0;
char szFile[MAX_PATH];
PSTR pszFile = szFile;
int nLine = 0;
_CrtIsMemoryBlock (pNum, 12, &lReg, &pszFile, &nLine);
当MFC程序中出现内存泄漏时,程序结束会输出内存泄漏信息,如:
Detected memory leaks!
Dumping objects ->
{56} normal block at 0x003F69D8, 12 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
其中56就是泄漏的内存的序列标志值,在Debug模式下可以利用_CrtSetBreakAlloc函数使程序运行到分配该内存的位置时中断,以便查找确切的泄漏位置,如:
_CrtSetBreakAlloc(56);
这样程序运行到分配该位置的内存时就会发生中断,通过调用堆栈可以查看泄漏的代码位置。
_CrtSetBreakAlloc函数的调用位置需在分配内存之前,如果不知道分配内存在哪里,那就放到程序运行的开始处,如_tWinMain入口函数的开始处。
int* pNum = (int*)_malloc_dbg(12, _NORMAL_BLOCK, __FILE__, __LINE__);
...
...
...
long lReg = 0;
char szFile[MAX_PATH];
PSTR pszFile = szFile;
int nLine = 0;
_CrtIsMemoryBlock (pNum, 12, &lReg, &pszFile, &nLine);
当MFC程序中出现内存泄漏时,程序结束会输出内存泄漏信息,如:
Detected memory leaks!
Dumping objects ->
{56} normal block at 0x003F69D8, 12 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
其中56就是泄漏的内存的序列标志值,在Debug模式下可以利用_CrtSetBreakAlloc函数使程序运行到分配该内存的位置时中断,以便查找确切的泄漏位置,如:
_CrtSetBreakAlloc(56);
这样程序运行到分配该位置的内存时就会发生中断,通过调用堆栈可以查看泄漏的代码位置。
_CrtSetBreakAlloc函数的调用位置需在分配内存之前,如果不知道分配内存在哪里,那就放到程序运行的开始处,如_tWinMain入口函数的开始处。
相关文章推荐
- 如何快速定位Android内存泄漏位置
- 快速定位内存泄漏的位置
- 快速定位死循环位置
- Windows 8 地理位置定位 1.快速上手
- 内存泄漏快速定位方法
- c# JD快速搜索工具,2015分析JD搜索报文,模拟请求搜索数据,快速定位宝贝排行位置。
- 使用LeakCanary快速定位解决Android内存泄漏
- 快速定位软件的安装位置
- 快速定位磁盘满的位置
- C/C++代码调试:快速定位内存的申请和释放的位置
- php中不借助IDE快速定位行数或者方法定义的文件和位置
- dSYM-如何快速定位到已发布程序的crash位置(一)
- html快速定位到表单没有填写的位置
- 如何检测死锁并快速定位死锁位置
- 快速定位到单链表的中间位置的节点
- 【经验小谈】百度定位api使用 百度定位demo 百度地图快速定位 百度地图获取当前位置 获取自己的位置 百度定位示例
- WinDBG快速定位异常位置
- C/C++代码调试:快速定位内存的申请和释放的位置
- Android Studio快速定位当前文件所在的位置
- 快速定位app crash 的位置