zoukankan      html  css  js  c++  java
  • CRT detected that the application wrote to memory after end of heap buffer错误

    转载:http://blog.csdn.net/wu_lai_314/article/details/8241697

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

    多是中间对其进行了一些操作,在程序结束处,释放内存的时候,引起错误:



    HEAP CORRUPTION DETECTED:after Normal block(#***) at 0x****.CRT detected that application wrote memory after end of heap buffer.


    错误原因:


    以对内在操作的过程中,所写的地址超出了,所分配内在的边界

    memcpy的时候, copy的大小超出了目标数组的大小

    有个建议是:

    1、内存申请多少释放多少,释放掉你申请过的内存,不要乱释放;
    2、不能释放已经释放的内存;

     

    网友还有一个建议是:

    “增大内存开辟空间,new时多加1或者更大,这样就不会导致内存释放时,越界!
    比如 int* p = new int[6];
    for(int i=0;i<5;i++)
    p[i]=i;
    delete []p;
    这样子实际用了5个,就会成功释放!!!”

     

     

    以下小部分画线内是另一个网友的笔记:

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------

    ans = new int[size_a+size_b];        // 动态分配数组空间

    delete [] ans;

    一把delete [] ans;删掉程序就不弹出错误,这是为什么呢??

    错误原因

    因为对内存的操作越界了,超出所分配的内存的边界。

    解决:

    增大分配的内存!   

    e.g.

    ans = new int[size_a+size_b +1 ];     

    或者加到自己适宜的大小,问题即可解决...

    总结:

    对内存的操作要细之又细,new完后要delete,操作时不要越界(包括向前越或向后越).......

    另外添加一下:我是很快找到这个错误 因为我在网络上找到一种快速检测内错泄漏的方法:

    只有一行代码: _ASSERTE( _CrtCheckMemory( ) );

    相当好用。。。

  • 相关阅读:
    db2中的常用命令及使用方法
    互联网服务应用协议设计
    Zookeeper整理(一)- 写操作产生事件,写操作与Watcher对应关系
    实现自己的连接池(一)
    SMP、NUMA、MPP体系结构介绍
    随手备忘 ubuntu12.04 lts 安装gcc 4.8
    认真体会 结构体中的零长度数组
    由内存池实现总结内存对齐问题
    认真理解 oom killer 备忘
    仔细体会 epoll中的et lt模式
  • 原文地址:https://www.cnblogs.com/ldjhust/p/3104622.html
Copyright © 2011-2022 走看看