zoukankan      html  css  js  c++  java
  • 谈"DAMAGE:after Normal block"的解决方法

    在释放内存时,崩溃了,出现了如下错误:

    User breakpoint called from code at 0x7c921230

    Debug Assertion Failed! Program:...

    File: dbgheap.c

    Line: 1011 Expression: _CrtIsValidHeapPointer(出现问题的指针)

    For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts.

    (Press Retry to debug the application)

    如果点击忽略,则继续弹出对话框 Debug Error! Program:...

    DAMAGE: after Normal block (#4826967) at 0x2000E148.

    (Press Retry to debug the application)

    正如上次所述(http://hi.baidu.com/ablenavy/blog/item/6092524e88ff020db2de0516.html

    (DAMAGE:after Normal block的解决方法)

    这次的原因依然是内存申请得太小!

    具体代码如下:

    #define P2Node_LEN_1 (1024 * 10)

    #define P2Node_LEN_2 1024 // Sct_Node是一个结构体

    Sct_Node **p2Node; //定义一个指向Sct_Node的指针的指针,相当于二维数组。

    // 空间申请

    p2Node = (Sct_Node **)malloc(P2Node_LEN_1 * sizeof(Sct_Node *));

    for (int i = 0; i < P2Node_LEN_1; i++)

    {

        p2Node[i] = (Sct_Node *)malloc(P2Node_LEN_2 * sizeof(Sct_Node));

    }

    // 向p2Node插入数据

    pSharedData->p2Node[i][j] = sct_Node; // 释放空间

    for ( int i = 0; i < P2Node_LEN_1; i++ )

    {

        free( p2Node[i] ); //经调试,在该语句中出现崩溃。

    }

    free( p2Node );

    经跟踪程序发现,在向p2Node插入数据时,j的值超过了1024,但可以正常插入,不会出现错误,等释放空间时才出现错误。

    解决办法:

    将 #define P2Node_LEN_2 1024 改为:

    #define P2Node_LEN_2 (1024 * 10)

    如何从根本上消除这种错误?!

    其实很简单,在插入时加入边界检查,如下:

    将插入语句:

    pSharedData->p2Node[i][j] = sct_Node;

    改为:

    if ( j >= P2Node_LEN_2 )

    {

        cout << "Error! Out of memory! P2Node_LEN_2 is too small" << endl;

        exit(1);

    }

    pSharedData->p2Node[i][j] = sct_Node;

    这样就可以避免出现上述的崩溃现象了。

  • 相关阅读:
    c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变
    C# 一个数组未赋值引发的错误
    c# 2016QQ自动登录程序
    当时钟事件声明为过程变量 让system.threading.timer时钟失效
    if 循环的深入理解 哈希表的一种应用
    VB6对象与地址相互转换
    VB6的函数指针传递
    .net framework 4.0 从 GAC 卸载 程序集
    .net framework 4.0 从 GAC 卸载 程序集
    GAC in CLR 3.0
  • 原文地址:https://www.cnblogs.com/y0umer/p/3839409.html
Copyright © 2011-2022 走看看