CRT detected that the application wrote to memory after end of heap buffer

简介HEAP CORRUPTION DETECTED: after Normal block 用new申请了一个特定大小的内存,但是后期对这块内存进行复制,可能超过了该内存大小的范围,再进行delete的时候,就会报错。 1、heap corruption detected http://vopit.blog.51cto.com/2400931/645980 heap corruption detected:after normal block(

HEAP CORRUPTION DETECTED: after Normal block


用new申请了一个特定大小的内存,但是后期对这块内存进行复制,可能超过了该内存大小的范围,再进行delete的时候,就会报错。


1、heap corruption detected

http://vopit.blog.51cto.com/2400931/645980

heap corruption detected:after normal block(#xxx) at 0x xxxxxxxx
crt detected that the application wrote to menory after end of heap buffer
这是典型的内存溢出错误,常在内存的delete处发生,而且一般在debug版本中可能出现,release版本中可能并不报错.
出现这个错误的原因一般都是操作new申请的内存溢出,因为在c++中,如果用new分配一段内存,操作的时候改变了该部分的大小,在delete时就会出错.比如说如下部分:
char* p=new char[5];
strcpy(p,"aaaaa");
delete[] p;
这段代码就会出错,因为申请了一个size为5的内存,但是strcpy过去了一个size为6的字符串,因此破坏了这个指针,运行debug版本的时候就会出现先前的错误,但是在release版本中,溢出一个字节的内存很有可能是没有错误的,然后潜在的隐患是肯定存在的,因此,我们在debug遇到这样的错误时候一定要仔细检查对new出的指针的操作.

***************拷贝时,内容超出申请的空间***********
如memcpy的时候,size参数比new出来的空间还大



2、heap corruption detected after normal block
http://hi.baidu.com/linzch/blog/item/3ceb4dedef60e7d9b31cb1e5.html
*********一般是内存溢出错误。需要检查指针对内存的申请情况*************

3、 heap corruption detected
http://blog.csdn.net/fjz13/article/details/2535126
**********sscanf(str, "X", &pCmd[i]);中pCmd分配的空间不足************

4、HEAP CORRUPTION DETECTED:after Normal block(#***) at 0x****.CRT detected
that application wrote memory after end of heap buffer.
http://bbs.ednchina.com/BLOG_ARTICLE_2103923.HTM
错误原因:以对内在操作的过程中,所写的地址超出了,所分配内在的边界
解决办法:在可能出错的代码处,使用_CrtCheckMemory进行检测错误的现象是这样的:



delete 只能用来删除用new分配的空间。
你用X=new int;那么这时X保存的是你向系统申请的空间的地址(new int的地址),这个地址你可以用delete把它释放。但是你在后面写着X=&varOne,那么这时X保存的是varOne变量的地址,这个变量是局部变量,函数返回时会自动释放的而不是你用delete释放的。你用了delete把varOne释放就是不合法的,确切的说varOne变量在栈区(内存的栈里头),而你用new分配的空间在堆里头,他们的内存区域是不同的,不能乱来。这里错误的原因是你把系统分配给你的varOne释放了导致错误,你释放的应该是new int的空间,而这个空间的地址本来用X保存的,但是你后面改了X的地址指向varOne,导致释放了varOne导致错误,因为他们内存区域不同,delete用于释放堆区的数据,而varOne是在栈区的。对于局部变量是放在栈区的,如果我们向系统申请空间,那么这个空间位于堆区,delete用于释放堆中的存储空间,不能胡来


delete详解:首先调用析构函数,完成类成员的释放,比如类成员有vector也指向了堆上的内存,就需要在析构函数中同样使用delete释放这块内存,或者说它自身处于一个容器当中,就需要在这个容器中erase它

然后再free掉整个对象的内存;

delete b过后,b仍然指向改内存,即地址不变,但指针可能为悬垂指针,访问它可能带来意想不到的结果,也可能正确访问,不确定,所以建议delete后,把指针设置成NULL,后面也可根据指针是否为NULL判断是否可用

新加评论 评论标题:

文章评论

    c++中delete和析构函数之间的区别

        2019-10-18    
    修改 删除

    delete=1.调用析构函数,释放对象中的成员资源

                2.归还对象空间(free)

    其中在调用析构函数的时候,有可能还会对其他对象进行delete,然后调用这个对象的析构函数。。。

    看这个例子:

    转载原文地址:

    https://www.cnblogs.com/wycnb/p/4664934.html

    delete用于释放new在堆中动态生成的对象空间。
    释放时会自动调用类的析构函数,在析构函数中用于释放类内部动态分配的得到的资源。

    然后delete再释放整个对象所占的内存空间


    1、new/delete是C++的操作符,而malloc/free是C中的函数。
    2、new做两件事,一是分配内存,二是调用类的构造函数;同样,delete会调用类的析构函数和释放内存。而malloc和free只是分配和释放内存。
    3、new建立的是一个对象,而malloc分配的是一块内存;new建立的对象可以用成员函数访问,不要直接访问它的地址空间;malloc分配的是一块内存区域,用指针访问,可以在里面移动指针;new出来的指针是带有类型信息的,而malloc返回的是void指针。
    4、new/delete是保留字,不需要头文件支持;malloc/free需要头文件库函数支持。


评论列表
c++中delete和析构函数之间的区别