C++内存泄漏

1. 内存泄漏

内存泄漏:指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

2.内存泄漏危害

最直接的危害就是系统内存耗尽,系统死机。内存泄漏是最难发现的常见错误之一,因为除非用完内存或调用 m a l l o c malloc 失败,否则都不会导致任何问题。如果程序运行时间足够长,如后台进程运行在服务器上,只要服务器不宕机就一直运行,一个小小的失误也会对程序造成重大的影响,如造成某些关键服务失败。

3.C++没有垃圾回收机制,我们需要关注那些类型的内存泄漏?
  • 堆内存泄漏。在内存中程序员手动分配的一块内存, m a l l o c malloc \ r e a l l o c realloc \ n e w new 。完成相关操作后,没有调用相对应的 f r e e free \ d e l e t e delete 释放掉内存,这时这块内存就会常驻内存,造成堆内存泄漏
  • 系统资源泄漏。分配给程序使用的资源没有使用相应函数释放,如 b i t m a p bitmap \ h a n d l e handle \ s o c k e t . socket.
4.内存泄漏排查
  • B o u n d s C h e c k e r BoundsChecker ,定位运行时发生的各种错误
  • 调试运行 D E B U G DEBUG 版程序,运用以下技术: C R T CRT ( C C r u n t i m e run-time l i b r a r i e s libraries )、运行时函数调用堆栈、内存泄漏时提示的内存分配序号(集成开发环境OUTPUT窗口),综合分析内存泄漏的原因,排除内存泄漏。
  • l i n u x linux 工具之检测内存泄漏- v a l g r i n d valgrind ,功能强大,不仅仅是内存泄漏检测工具。
5.怎样有效解决内存泄漏问题?
5.1 智能指针

因为智能指针可以自动删除分配的内存。智能指针和普通指针类似,只是不需要手动释放指针,而是通过智能指针自己管理内存的释放。

5.2 良好的编程习惯

尽量在涉及内存的程序段,检测出内存泄露。当程式稳定之后,在来检测内存泄露时,无疑增加了排除的困难和复杂度。

使用了内存分配的函数,要记得要使用其想用的函数释放掉,一旦使用完毕。

  1. H e a p Heap m e m o r y memory

成对使用:

分配函数 释放函数
m a l l o c malloc / r e a l l o c realloc f r e e free
n e w / n e w [ ] new/new[] d e l e t e delete / d e l e t e [ ] delete[]
G l o b a l A l l o c GlobalAlloc G l o b a l F r e e GlobalFree
要特别注意数组对象的内存泄露
int *ptr =new int[100];
其删除形式为:delete []ptr;
  1. R e s o u r c e Resource L e a k Leak

对于系统资源使用之前要仔细看起使用方法,防止错误使用或者忘记释放掉系统资源。

对于资源,也可使用 R A I I RAII R A I I RAII ( R e s o u r c e Resource a c q u i s i t i o n acquisition i s is i n i t i a l i z a t i o n initialization )资源获取即初始化,它是一项很简单的技术,利用 C + + C++ 对象生命周期的概念来控制程序的资源,例如内存,文件句柄,网络连接以及审计追踪( a u d i t audit t r a i l trail )等. R A I I RAII 的基本技术原理很简单.若希望保持对某个重要资源的跟踪,那么创建一个对象,并将资源的生命周期和对象的生命周期相关联。利用 C + + C++ 的对象管理管理资源.

参考:C++内存泄漏及解决办法
C++内存泄露和内存管理

猜你喜欢

转载自blog.csdn.net/qq_38790716/article/details/89479501