消息关闭
    暂无新消息!

C++delete触发断点

问题作者 : Auchinleck2017-08-31发布
请各位大神帮忙看一下这个子程序,每次运行到delete那一句的时候,就会触发断点(如图),谁能解释一下?谢谢!其中CODELEN=1000,其他参数在主程序里已经定义过了




3个回答

︿ 1
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
︿ 1
检查下是否越界写到了地址(v1-1)的位置。可能v1的下标曾出现过负数,或者写其他数组时越界写到过v1的前一个位置。

动态数组在堆中的存储方法是,在正式数组之前有一个整型数据存储数组的长度,以供删除时使用。若这个位置被修改为一些无效的数字,比如负数或者大到越界,那么在delete[]时候就会出现错误。
︿ 0
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
#include <time.h>
#include <stdlib.h>
#include <windows.h>
int main() {
    int a,b[11];//本来是b[10],为判断哪句越界,故意声明为b[11]

    srand((unsigned int)time(NULL));//按两次F11,等黄色右箭头指向本行时,调试、新建断点、新建数据断点,地址:&b[10],字节计数:4,确定。
    while (1) {//按F5,会停在下面某句,此时a的值为10,b[10]已经被修改为对应0..4之一。
        b[(a=rand()%11)]=0;
        Sleep(100);
        b[(a=rand()%11)]=1;
        Sleep(100);
        b[(a=rand()%11)]=2;
        Sleep(100);
        b[(a=rand()%11)]=3;
        Sleep(100);
        b[(a=rand()%11)]=4;
        Sleep(100);
    }
    return 0;
}