堆引起的超奇怪错误,真正的高手进
该错误有如下特点:
1.该错误是逻辑错误,即调用的函数返回错误的值;不是编译错误或运行报错。
2.Debug模式怎么改都是正常,Release模式错误。
3.在Release模式下改变编译选项“在共享DLL中使用MFC”会导致正确。(高手知道Release模式这个选项默认是啥吧)
4.出错的调用在函数C中。
模型是函数A,B,C
调用A-> C,则无论Debug还是Release都是正确;
掉用A-> B-> C,则C中函数出错;
B的内容是:
char *p = new char[1024];
delete[] p;
return true;
就这3行导致错误。基本没有任何意义,但是会导致下面C中函数调用出错。
(没有这个堆就是正常的)
有如下变化情况:
1.在函数C中,有个栈。
char s[64];
若将这个栈改为s[16]或s[1024]都会导致Release下正常。
2.在函数C中,随便新定义一个栈
char ss[16]; 对这个栈赋值,也会导致Release下正常;
若只定义,不赋值,就还是错误。
3.在函数C外,定义的全局栈在函数C内操作不会影响结果,Release下还是错误。
4.函数C中出错的调用有长指针和短指针的强制转换过程。上面的影响就是对这个调用起的作用而导致正确或错误。
请大家分析下原因,Release下调试很麻烦,经常在函数C中加了点语句打印之类的就导致结果又正确了。
[解决办法]
这种问题不是越界还能是什么??
[解决办法]
应该是堆对象聚合了数组元素了吧?
是这个数组越界了,而不是你给的数组越界了。
然后导致看起来像是堆错误了。
[解决办法]
不是很理解楼主的问题,但是以前遇见过一个类似的问题:Debug下无错,Release下出错。而且不好跟,因为出错地方乱跳。最后发现原因是内存越界,而且正好压到了函数的返回地址。建议楼主可以使用注代码的方式跟踪。简单有效!
PS:楼主可以查一下Debug和Release的区别
[解决办法]
首先不要怀疑真理. 这里你可以把工具暂时当作真理,虽然也有bug,不过一般你碰不到的.
所以基于上面的假设,如果debug/release表现不一样一定是你的程序有问题. (本人多次验证)
你看到的正确只是碰巧罢了,还是要从程序本身查起,而多半造成这样的错误的都是内存上的操作错误造成的,使得程序运行的栈空间被破坏了.
可以检查指针使用情况, 越界操作情况, 等等内存相关内容.
以上错误代码还可能造成许多莫明其妙的错误,比如vs调试的时候明明简单的加法运算发现watch出来的value就是不对.
[解决办法]
把自己的栈中的变量赋上一些比较规律的值,然后将出错后的memory dump下来。查一下是不是冲掉了一些有用的数据。
或者干脆用windbg debug一下好了
[解决办法]
release和debug用的new是不一样的
[解决办法]
源码面前,了无秘密!!!!!!!!!!!!!
发代码出来就行了,说那么也没有看懂~~~~~~~~~~~~
如果单纯这段代码加到一个空工程有错误,就是这段代码错,否则恐怕多是其他地方的错误,很随机的再这个地方表现错来了而已~~~~~~~~~~~
[解决办法]
有可能是其他地方的代码,或者很远的代码,越界访问正好覆盖了你这段新申请内存的控制结构或者特定内容,导致不可预估的错误
暴露时间不定,位置偏移
最好是挨着删代码,删到哪问题消失了。就是问题的引发点