C++内存泄漏

内存溢出与内存泄漏

内存溢出指的是内存越界,一种常见情况是调用栈溢出,栈内存不足的一种。

内存泄漏 内存申请后,用完没有释放,可用内存越来越少。

内存泄漏是最难发现的错误之一,除非用完内存或者调用malloc失败,否则不会导致任何问题。

windows平台下的内存泄漏检测
Visual Studio 调试器与C运行时库提供了一种检测内存泄漏的有效方法, 原理大致如下:

内存分配需要通过C运行时库实现,在分配内存与释放内存时做好记录,然后在程序结束时对比分配内存与释放内存的记录既可以确定是否有内存泄漏问题。

通过include进来一个头文件crtdbg.h将 malloc与free函数映射到它们的调试版本, 调试版本函数会跟踪内存分配与释放。
最后在程序退出的时候调用一个CrtDumpMemoryLeaks函数在输出窗口显示内存泄漏信息**(包含内存泄漏文件以及对应的代码行数**)。

上述操作可以定位到哪个函数出现内存泄漏, 但是项目可能有多处调用,但是不知道哪处导致内存泄漏。

因此还需对应用程序的内存状态拍快照,CRT库提供一种结构类型, _CrtMemState,存储内存状态快照
然后通过_CRTMemCheckPoint调用,生成快照。分别在程序的开始与结尾调用该函数。
最后通过_CRTMemDifference比较快照差异,判断是否有内存溢出。

Linux平台下的内存泄漏检测:
与win原理相同,名称叫 mtrace.

工具:valgrind
在它的环境中运行程序监视内存的使用情况。
valgrind --leak-check=full --show-reachable=yes --trace-children = yes ./a.out
参数分别表示 完全检测内存泄漏, 显示内存泄漏地点,跟着进入子进程

总结:
内存泄漏原因概括为: 调用了malloc/new等内存申请的操作,但是缺少对应的free/delete。检测内存泄漏的关键原理就是检查malloc/new与free/delete是否匹配。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值