当堆内存位置的内容由于编程行为而被修改,超出了原始程序构造的意图时,计算机程序就会发生内存腐败,也可以叫内存破坏;这被称为违反内存安全。内存腐败的最可能原因是编程错误。当腐败的内存内容稍后在该程序中使用时,它要么导致程序崩溃,要么导致奇怪的程序行为。Windows系统上近10%的应用程序崩溃是由于堆腐败造成的。像C和C++这样的现代编程语言具有显式内存管理和指针运算的强大功能。这些特性是为开发高效的应用程序和系统软件而设计的。但是,错误地使用这些功能可能会导致内存腐败错误。
在win32里,当程序损坏分配程序对堆的视图时,就会发生堆损坏。结果可能是相对良性的,并导致内存泄漏(有些内存没有返回到堆中,之后程序无法访问),或者可能是致命的,并导致内存错误,通常是在分配器内部。内存错误通常发生在分配程序中,当堆损坏后分配程序处理一个或多个空闲列表时。
内存腐败是最难处理的编程错误之一,原因有二:
内存腐败错误大致可分为四类:
在win32里,下面情况可能发生:
在c++语言编程里,具体有如下原因:
根据被破会的内存位置,程序会有不同的表现形式,常见就是程序崩溃掉。如果被破坏的是是堆/堆段/堆块等管理边界结构,那么在win32里,一般会触STATUS_HEAP_CORRUPTION
异常,此时的异常结构EXCEPTION_RECORD成员值一般如下:
EXCEPTION_RECORD:
ExceptionAddress:异常地址
ExceptionCode: c0000374
ExceptionFlags: 00000001
NumberParameters: 1
Parameter[0]: 导致此异常的最终函数
0xC0000374就是堆内存腐败的异常代码,他定义如下
file:..../winnt.h #define STATUS_HEAP_CORRUPTION ((DWORD )0xC0000374L)
一是保证代码质量,二是提早发现。在win32里,由于堆腐败造成的崩溃几乎不可能在事后调试。避免这些问题的最佳方法是使用应用程序验证程序中的页面堆功能进行测试。页面堆有两种类型:“Full”和“Light”。Full是默认值;它将在检测到损坏时立即强制调试器停止。此功能必须在调试器下运行。然而,它也是最需要资源的。如果用户有时间问题并且已经在“完整”页面堆下运行了一个场景,那么将其设置为“轻”可能会解决这些问题。此外,轻页堆在进程退出之前不会崩溃。它确实提供了对分配的堆栈跟踪,但诊断所需的时间要比充分利用它的完全对应项要长得多。
堆内存腐败异常(STATUS_HEAP_CORRUPTION---0xC0000374)
原文:https://www.cnblogs.com/yilang/p/11842828.html