c++内存泄漏的解决方法,c++内存泄漏的几种情况
环境:Windows10,VS2019,Qt5.9.7,C 11
目的:定位并解决内存泄漏问题。
VS2019自带的诊断工具可以在程序运行时打开诊断工具窗口——“检查内存使用情况——”启用堆栈快照。
根据各种差异,点击左侧箭头指示的视图实例,准确定位内存泄漏点。
Windows CRT调试(用CRT库查找内存泄漏)官方有详细描述:官网链接:用CRT库查找内存泄漏-visual studio(Windows) Microsoft Docs
我简单描述一下:
1://debug _ new.cpp
//使用cl/EHsc/W4/D _ DEBUG/MDd DEBUG _ new . CPP进行编译
#define _CRTDBG_MAP_ALLOC
#包含cstdlib
#包含crtdbg.h
#ifdef _DEBUG
#定义DBG_NEW new ( _NORMAL_BLOCK,__FILE__,__LINE__)
//如果需要,用_CLIENT_BLOCK替换_NORMAL_BLOCK
//分配为_CLIENT_BLOCK类型
#否则
#定义DBG _新新
#endif
结构窗格{
int x;
};
void main() {
Pod * pPod=DBG _新Pod;
pPod=DBG _新荚;//哎呀,泄露了pPod原文!
删除pPod
_ CrtDumpMemoryLeaks();//直接打印内存泄漏信息
}模式2:/2://#ifdef _DEBUG
//# define DEBUG _ CLIENT BLOCK new(_ CLIENT _ BLOCK,__FILE__,__LINE__)
//#else
//#定义调试_客户端块
//#endif
//#define _CRTDBG_MAP_ALLOC
//#包含stdlib.h
//#包含crtdbg.h
//#ifdef _DEBUG
//#定义新的调试客户端块
//#endif
//_CrtMemState s1,s2,S3;
//_ CrtMemCheckpoint(S1);//记录s1的内存数据
//做某事
//_ CrtMemCheckpoint(S2);//记录s1的内存数据
//if (_CrtMemDifference( s3,s1,s2))
//_ CrtMemDumpStatistics(S3);//内存泄漏,两个内存数据不一致,差结果返回s3。打印信息VLD(可视化泄漏检测器)仅适用于vc,而Visual C #的增强内存泄漏检测非常易于使用。如果你也是msvc编译项目,强烈推荐这种方法。只需要在所使用的项目中的任何文件处包含它的“vld.h”头文件,这样会使调试更加笨拙。此外,还需要在项目属性中添加vld头文件和库文件所在的路径。按理说这两条路径都要加在环境变量里才能够全局使用,但是我试过了,就是不行。我不知道为什么。
程序加载成功后,可以看到程序运行时的打印信息,提示您加载vld库。关闭程序后,调试窗口会打印内存泄漏等信息。
官方网站:Visual Leak Detector Visual C #的增强内存泄漏检测
养成良好的C编码习惯,合理使用c 11及以上提供的智能指针,合理使用RALL机制转行。对了,下面是linux下Valgrind常用的Linux调试工具。网上很多资料不介绍。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。