`
weihe6666
  • 浏览: 443416 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

HEAP CORRUPTION DELETED

阅读更多
HEAP CORRUPTION  DELETED


今天写了个关于字符串处理的程序,但是进行delete时出现了HEAP CORRUPTION  DELETED错误,
查找相关资料,找出来出错原因。

先看一个例子:

#include <string.h>
#include <iostream>
using namespace std;


int main()
{
	char * str;
	char *str2 = "hewei";
	str = (char *) malloc(strlen(str2)); //注意这里,分配的数组大小应该为:strlen(str2)+1 别忘了'\0',而这里只分配了strlen(str2),会出现HEAP CORRUPTION  DELETED 错误。
	memcpy(str,str2,strlen(str2)+1);
	cout << str << endl;
	delete [] str;

	return 0;
}

运行时又HEAP CORRUPTION  DELETED bug,原因何在?
首先说明一下什么是Heap Corruption。当输入超出了预分配的空间大小,就会覆盖该空间之后的一段存储区域,这就叫Heap Corruption。

在VC里面,用release模式编译运行程序的时候,堆分配(Heap allocation)的时候调用的是malloc,如果你要分配10byte的空间,那么就会只分配10byte空间,而用debug模式的时候,堆分配调用的是_malloc_dbg,如果你只要分配10byte的空间,那么它会分配出除了你要的10byte之外,还要多出约36byte空间,用于存储一些薄记信息,debug堆分配出来之后就会按顺序连成一个链。

        那么我们再来看看薄记信息中有些什么。还是上面10byte分配空间的例子,那么分配出的10byte空间的前面会有一个32byte的附加信息,存储的是一个_CrtMemBlockHeader结构,可以在DBGINT.H中找到该结构的定义:
typedef struct _CrtMemBlockHeader
{
// Pointer to the block allocated just before this one:
   struct _CrtMemBlockHeader *pBlockHeaderNext;
// Pointer to the block allocated just after this one:
   struct _CrtMemBlockHeader *pBlockHeaderPrev;
   char *szFileName;    // File name
   int nLine;                  // Line number
   size_t nDataSize;      // Size of user block
   int nBlockUse;         // Type of block
   long lRequest;          // Allocation number
// Buffer just before (lower than) the user's memory:
   unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;

/* In an actual memory block in the debug heap,
 * this structure is followed by:
 *   unsigned char data[nDataSize];
 *   unsigned char anotherGap[nNoMansLandSize];
 */

结构中的_CrtMemBlockHeader结构两个指针就不用解释了,szFileName是存储的发起分配操作的那行代码所在的文件的路径和名称,而nLine则是行号。nDataSize是请求分配的大小,我们的例子里当然就是10了,nBlockUse是类型,而lRequest 是请求号。最后一项gap,又称NoMansLand,是4byte(nNoMansLandSize=4)大小的一段区域,注意看最后几行注释就明白了,在这个结构后面跟的是用户真正需要的10byte数据区域,而其后还跟了一个4byte的Gap,那么也就是说用户申请分配的区域是被一个头结构,和一个4byte的gap包起来的。在释放这10byte空间的时候,会检查这些信息。Gap被分配之后会被以0xFD填充。检查中如果gap中的值变化了,就会以Assert fail的方式报错。不过vc6中提示的比较难懂,DAMAGE :after Normal block(#dd) at 0xhhhhhhhh,而vs2005里面会提示Heap Corruption Detected!而如果你是release版本,那么这个错误就会潜伏直到它的破坏力发生作用。


上例子中:
str = (char *) malloc(strlen(str2));
分配的数组大小应该为:strlen(str2)+1 别忘了'\0',而这里只分配了strlen(str2),会出现HEAP CORRUPTION  DELETED 错误。

当分配的大小小于填充的大小时,就会发生堆的覆盖,即上面unsigned char gap[nNoMansLandSize];被覆盖,所以当用delete []删除时就会出错。
分享到:
评论

相关推荐

    解决报错heap corruption detected after normal block.zip

    在编程过程中,尤其是在C语言和使用Visual C++(VC)编译器的环境中,"heap corruption detected after normal block"是一个常见的错误提示,它通常表明在程序执行时内存堆出现了损坏。这个错误通常与动态内存分配(如...

    Debugging Heap Corruption in Visual C++

    Debugging Heap Corruption in Visual C++ Debugging Heap Corruption in Visual C++ 是一篇关于使用 Microsoft Debugging Tools for Windows 调试 Visual C++ 堆腐败的文章。堆腐败是指在堆中分配的内存被意外地...

    Heap Corruption(解决方案).md

    Heap Corruption(解决方案).md

    ERR_HEAP_CORRUPTION(解决方案).md

    项目中碰到的,记录一下

    heapdump分析工具HeapAnalyzer

    heapdump分析工具------HeapAnalyzer: 2014年1月最新发布 用法: 在命令行执行 java -Xmx500m -jar ha453.jar

    IBM的HeapAnalyzer

    IBM的HeapAnalyzer是一款强大的内存分析工具,主要用于诊断Java应用程序中的内存泄漏问题。它能帮助开发者深入理解Java虚拟机(JVM)的堆内存状态,通过分析heap dump文件,找出那些占用内存过大的对象,以及这些...

    heapdump分析工具

    当遇到应用程序运行缓慢,频繁出现Full GC,甚至出现OutOfMemoryError等问题时,我们通常需要对堆内存进行深入分析,这就是heapdump工具的作用所在。heapdump工具可以帮助开发者诊断Java应用的内存泄漏、过度对象...

    heapdump-tool工具

    【标题】:heapdump-tool工具 【正文】: 在IT领域,内存管理是优化系统性能的关键环节,尤其是在Java应用程序中。Heapdump-tool工具是专为Java开发者设计的,用于生成和分析堆转储(Heap Dump)文件的强大工具。...

    heap Analyzer heapdump分析工具

    heap Analyzer heapdump分析工具

    heapdump分析工作heapanalyzer的使用及工具

    heapdump分析工作heapanalyzer的使用及工具 java -Xmx1000m -jar ha443.jar

    iOS 拦截奔溃 使程序不在崩溃

    在iOS开发中,确保应用程序的稳定性和可靠性是至关重要的。然而,由于各种原因,应用程序可能会出现奔溃。为了解决这个问题,开发者可以采用一种技术,即“拦截奔溃”,使得程序在遇到错误时不会直接终止运行,而是...

    ibm的heap analyzer.zip

    IBM Heap Analyzer是一款强大的内存分析工具,主要用于Java应用程序的性能优化,特别是针对IBM J9 JVM的内存管理和垃圾收集进行深入分析。这款工具可以帮助开发者诊断和解决内存泄漏、过度对象分配以及垃圾收集效率...

    java 内存溢出分析工具 HeapAnalyzer

    HeapAnalyzer是一款强大的工具,专为分析Java应用程序的内存状况,特别是针对内存溢出问题进行诊断。本文将详细介绍HeapAnalyzer的使用、功能以及如何通过它来排查和解决Java OOM问题。 一、HeapAnalyzer简介 Heap...

    Understanding the Low Fragmentation heap(LFH)

    - **Heap Corruption**:堆腐败,指的是堆中的数据结构被意外或恶意修改的情况,可能导致程序崩溃或安全漏洞。 #### 数据结构 ##### _HEAP - `_HEAP` 是一个顶级数据结构,它代表了整个堆。 - 包含了指向其他子结构...

    Heap Dump的IBM分析工具.zip

    "Heap Dump的IBM分析工具.zip" 提供了一个专门用于解析和分析heap dump的IBM工具,帮助我们更好地理解JVM内存的状态。 Heap dump文件是Java虚拟机(JVM)在特定时间点生成的一种文件,它包含了JVM堆内存中的所有...

    native_heapdump_viewer.py

    使用方法如下: ...python native_heapdump_viewer.py --symbols symbols 00.txt &gt;00.log python native_heapdump_viewer.py --symbols symbols 01.txt &gt;01.log 对比00.log和01.log,查看内存增长的点

    解决Java_heap_space问题

    ### 解决Java_heap_space问题:深入理解与策略 在Java应用程序开发与运行过程中,经常会遇到一个常见的内存管理问题——“Java heap space”。这个问题通常表现为Java虚拟机(JVM)在执行过程中因可用堆内存不足而...

Global site tag (gtag.js) - Google Analytics