.exe 已触发了一个断点。

这是我第一次碰到这种问题,查了很多资料,大家都说是内存越界导致的,但是我写的这个程序已经大概5000行了,在哪个地方越界的?这个很难找。于是我把整个程序中所有存在new的地方全部查看一遍,确实找到了一些越界的地方。可是修改后仍然这样。更奇怪的是,这个错误并不是一定会在某个地方出现,而是出现的位置带有一定的随机性,但都是在申请内存的时候。无奈,用VS2013的反汇编跟踪到出问题的地方,是一句 jmp XXXX。看来问题很清楚了。程序需要跳转到一个地方去,但是这个地方的内存有问题。
面对这么大的程序,去找是谁把堆栈里面的东西搞乱了,还是相当困难了。逐步缩小范围,我大概找出来,是一个类实例化的时候,申请了一些内存,然后下次再申请的时候就出错了。但是这并不是原因。
    this->diameterNum = _diameterNum;
    this->isArtery = true;
    this->isVesselDark = true;
    this->isVesselSelect = false;
    this->isVesselValid = true;
    isCenterHighlight = new bool[diameterNum];  
    isCenterValid = new bool[diameterNum];
    side1 = new double[2 * diameterNum];
    side2 = new double[2 * diameterNum];    
    center = new double[2 * diameterNum];  
    angles = new double[diameterNum];  
    memset(isCenterHighlight, false, diameterNum * sizeof(bool));
    memset(isCenterValid, true, diameterNum * sizeof(bool));
    memset(side1, 0, 2 * diameterNum * sizeof(double));
    memset(side2, 0, 2 * diameterNum * sizeof(double));
    memset(center, 0, 2 * diameterNum * sizeof(double));
    memset(angles, 0, 2 * diameterNum * sizeof(double));

乍一看,这代码没啥问题吧。new 应该没错,看来只可能是 memset 了。于是我把memset全部注释掉,程序没问题了。可是我需要把这片内存初始化啊!而且 memset 是为啥出问题的还没找到。于是我又把这些 memset 一个一个去掉注释来调试,发现在最后一句出问题了。再仔细一看,天啊,我memset越界了!这个就是元凶!但是memset越界就会导致堆栈损坏吗?不一定!

    int * x0 = new int[LENGTH];
    int * x1 = new int[LENGTH];
    int * x2 = new int[LENGTH];
    memset(x0, 0, 3 * LENGTH * sizeof(int));
    int * x3 = new int[LENGTH];

这段代码明显是越界了,但是没报错,也没崩溃。有可能是memset如果把某个指针的指向位置置为0了。看来memset确实要谨慎使用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值