简介本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。
如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏。
因为VS自动在cpp文件中添加了如下代码:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
对于语句:int *p = new int[10]; 不释放产生的内存泄漏报告大体如下:
Detected memory leaks!
Dumping objects ->
e:\qt\ts man\mfcleak\mfcleakdlg.cpp(55) : {313} normal block at 0x004F9DF0, 40 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
双击“输出”窗口中,内存泄漏报告的文字”e:\qt\ts man\mfcleak\mfcleakdlg.cpp(55) : {313} normal block at 0x004F9DF0, 40 bytes long.”,或者在Debug窗口中逻辑按F4(VS2015),IDE就帮你定位到引起内存泄漏的对应文件的对应行,也就是这一句:
int* p= new int[10];
对应非MFC需要加入如下若干语句
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define NEW_WITH_MEMORY_LEAK_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__)
#define new NEW_WITH_MEMORY_LEAK_CHECKING
int main()
{
auto p = new int[10];
//delete[] p;
_CrtDumpMemoryLeaks();
getchar();
return 0;
}
内存泄漏报告大体如下:
Detected memory leaks!
Dumping objects ->
c:\users\administrator\desktop\win32projecttemplate\win32projecttemplate\win32projecttemplate.cpp(14) : {71} normal block at 0x011904D0, 40 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
这样调试方法就和MFC程序一样了。
还可以这样实现:
// 使用调试库
#define _CRTDBG_MAP_ALLOC
#include
#include
// 重定义new运算符
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new (_NORMAL_BLOCK,__FILE__,__LINE__)
#define new DBG_NEW
#endif
#endif
int _tmain(int argc, _TCHAR* argv[])
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
auto p = new int[10];
//delete[] p;
system("pause");
return 0;
}
本文向大家介绍一个C++实战项目:C++实现雪花算法(SnowFlake)产生唯一ID,主要涉及雪花算法、算法知识等,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文介绍一个C++代码片段:如何在C++中删除一个文件目录下的所有文件及目录,感兴趣的朋友可以参考一下。
本文介绍C++实现C++实现8种排序算法,主要包括冒泡排序、插入排序、二分插入排序、希尔排序、直接选择排序、堆排序、归并排序、快速排序,直接上代码,感兴趣的朋友可以参考一下。
本文介绍C++实现线程同步的四种方式:事件对象、互斥对象、临界区、信号量,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现一个多线程安全的队列容器模板类,主要涉及C++模板类的使用、互斥体实现多线程安全、队列数据结构等知识,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文实现C++中UTF-8与GB2312相互转换,感兴趣的朋友可以参考一下。