[源码和文档分享]基于重载算法的内存泄漏检测和内存越界检测

通过重载`new`,`delete`实现对在动态内存分配中内存越界和内存泄露的自动检测

1. 内存泄漏

1.1 简介

`内存泄漏`是当程序不正确地进行内存管理时出现的一种资源泄漏,表现为程序不再需要使用的内存空间并没有及时被释放掉。内存泄漏并非指物理内存的消失,而是在程序分配了某段内存后,由于设计错误,失去了对该段内存的控制,造成了内存的浪费.

1.2 危害

内存泄漏减少计算机可用内存,从而影响了计算机的性能。如果内存泄漏过于严重,整个操作系统、应用程序甚至会崩溃,计算机性能会大打折扣。但是,一般情况下,在现代操作系统中,当一个应用程序结束的时候,该应用程序所占用的内存会被操作系统自动地全部释放,因此,内存泄漏的后果往往不会很严重,甚至不会被察觉到。但是,当长时间运行程序或者设备内存较小时,内存泄漏的问题就不容忽视。作为程序员,我们有必要尽力避免内存泄漏,养成良好的编程习惯.

1.3 分类

内存泄漏尤其会发生在没有垃圾回收机制(Garbage collection)的编程语言,例如:C和C++,也就是说程序并不会自动实现内存管理。对于C和C++这两种语言,我们主要关心两种类型的内存泄漏:

  • 堆内存泄漏:程序通过`malloc`,`realloc`,`new`等函数在堆空间中申请了一块内存,但是在使用完后并没有用`free`,`delete`等函数将所申请的内存的内存释放掉,导致相应的那块内存一直被占用。

  • 系统资源泄漏:程序在使用系统分配的资源比如Bitmap,handle等之后,并没有用相应的函数释放掉,导致相应内存的占用和系统资源的浪费。

本次只针对堆内存泄漏提出自动检测的方法。

1.4 解决内存泄漏

解决内存泄漏的困难之处在于:

  • 编译器不能发现这些问题

  • 在程序运行时才有可能捕捉到这些错误,而且这些错误没有明显的症状,时隐时现

  • 一般解决内存泄漏必须需要程序员获得源码,通过修改源码的方式解决,比较耗时

因此,我们需要想出一种简便的方法,可以较大程度地自动检测出内存泄漏,及时提醒程序员对程序进行修正,在此我们通过重载`new`、`delete`函数的方式实现了自动检测的功能,下面将介绍`new`和`delete`函数。


参考文档和完整的文档和源码下载地址:

https://www.write-bug.com/article/106.html

猜你喜欢

转载自blog.csdn.net/demongwc/article/details/84779713