c/c++内存问题修复,内存使用剖析

8 篇文章 0 订阅
4 篇文章 1 订阅

c/c++能管理内存资源,能通过指针直接访问内存。c/c++的内存处理有很高的自由度、可控度和性能,但是也伴随着高昂的代价,即内存访问频繁的发生bug。

最常见的内存访问bug有内存泄漏(memory leak),内存管理的错误使用(incorrect use of memory management),缓冲区溢出(buffer overrun)和读取未初始化的内存(reading unnitialized memory)。

内存泄漏:在运行时分配,但当程序不再需要它时未释放的数据结构。如果内存泄漏频繁发生或很大,那么计算机所有可用主内存都将被耗尽。程序首先会变慢,因为计算机开始将页面转换为虚拟内存,最后以内存不足(out of memory)告终。

内存管理的错误使用:涉及一大类bug,例如多次释放一个内存块,在释放一个内存块之后又访问它,或释放一个从未分配的内存块。此类错误还包括,使用delete而不是delete[]来取消数组的分配,以及将malloc()与delete混用,或者将new与free()混用。

缓冲区溢出:在已分配内存外部的内存被改写或破坏。很多地方都可能发生缓冲区溢出,包括全局变量、栈上的局部变量,以及通过内存管理在堆上分配的动态变量。内存破坏的一个不良后果是,在改写内存的那条语句中看不到BUG。只有以后程序中另一条语句访问这个内存位置时,bug才会显露。由于内存位置有一个非法值,所以程序可能会产生多种错误行为,例如,程序可能会产生多种错误结果,或如果非法值在一个指针中,则程序将尝试访问被保护的内存并导致崩溃。如果函数指针变量被改写,则程序会跳转,并将数据当作程序代码来执行。关键是导致内存破坏的语句与触发可见bug的语句之间并没有明确的关系。

读取未初始化的内存:内存分配函数malloc()和操作符new不会初始化或清除已分配的内存块。未初始化的变量将包含无法预料的值。

 

有效的内存调试器,purify和valgrind等

 

当程序退出,Purify会查找泄漏的内存并给出未释放的内存报告.

Purify将内存分为三个状态,每个状态都会统计内存块的数量和大小.

Leaked memory

没有指针指向这块内存

Potentially Leaked memory

没有指针指向这块内存的头部,但是有指针指向这块内存的内部.

Memory in use

有指针指向的内存块(不存在泄漏的情况)

NOTE: 若运行的是一个需要长期不退出的程序,可以在程序尚在运行时,通过单击菜单栏中的`New Leaks tool`按钮来产生内存泄漏的情况报告.

 

参考链接:

https://blog.csdn.net/lujun9972/article/details/46003017

https://blog.csdn.net/haoel/article/details/2904

https://blog.csdn.net/destina/article/details/6198443

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小帆别吃糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值