C++的内存泄漏检测
2018-06-17 23:27:47来源:未知 阅读 ()
C++大量的手动分配、回收内存是存在风险的,也许一个函数中一小块内存泄漏被重复放大之后,最后掏空内存。
这里介绍一种在debug模式下测试内存泄漏的方法。
首先在文件的开头以确定的顺序写下这段代码:
1 #define _CRTDBG_MAP_ALLOC 2 #include <crtdbg.h> 3 #include <stdlib.h>
第1行定义了宏,实现一些内存分配函数向debug模式的映射。
打开<crtdbg.h>我们可以找到这么一段代码:
可以看到,定义了_DEBUG情况下,定义_CRTDBG_MAP_ALLOC会将函数映射为_dbg的版本。
第二个步骤,对new做一个重定义
1 #define NEW_WITH_MEMORY_LEAK_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__) 2 #define new NEW_WITH_MEMORY_LEAK_CHECKING
这里new采用的是VC++对operator new的一个重载,可以在<vcruntime_new_debug.h>中找到,这里不多讲了。
完成以上两步之后,程序中new和delete回收的过程便被VC++监视了,在程序退出的地方采用
1 _CrtDumpMemoryLeaks();
便可以在“输出”窗口查看报告了。
举个栗子
1 #define _CRTDBG_MAP_ALLOC 2 #include <stdlib.h> 3 #include <crtdbg.h> 4 #define NEW_WITH_MEMORY_LEAK_CHECKING new(_NORMAL_BLOCK,__FILE__,__LINE__) 5 #define new NEW_WITH_MEMORY_LEAK_CHECKING 6 7 int main() 8 { 9 auto p = new int[10]; 10 _CrtDumpMemoryLeaks(); 11 return 0; 12 }
这里还有一点,VC++的编译器cl.exe在delete之后会将内存置为0xcdcd防止再次利用,这里显然是程序结束时对p进行了回收。
此外,还要介绍一个new的玩法。
(尤其标准库中很突出)C++程序使用了placement new,这里我不是要介绍这个用法,想了解的自行。
placement new在new后边跟了括号,这会和上面提到的VC++重载的new冲突,那么怎么避免,在其他地方宏定义了新的new而和placement new冲突的情况?
相信大家一定见过像下面的代码
1 #pragma push_macro("new") 2 #undef new 3 //using the raw new 4 #pragma pop_macro("new")
#pragma push/pop_macro将宏定义名压/弹栈,这里现将宏new压栈,保留原来的定义,之后取消定义,使用原生的new,使用完毕后弹栈恢复宏定义。
以上是我介绍的对new出来的内存进行泄漏检测的简单方法,以及延伸出的一点常用技巧。
感谢阅读
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash