Run-Time Check Failure #2 - Stack around the variable 'cinfo' was corrupted.问题

来源:互联网 发布:淘宝裤子尺码对照表 编辑:程序博客网 时间:2024/05/17 20:33

    之前在网上下了个MFC程序,编译成功,但是运行后出现"Run-Time Check Failure #2 - Stack around the variable 'cinfo' was corrupted.“的中断,虽然点继续好像并不影响结果,但是有这个问题还是要解决。

    上网查了相关的内容,网上说的是一个数组,在使用的时候超过下标,越界后出现该中断。因为是堆栈出现问题,应该是在使用的时候操作不当。

    在我调试的程序中用到的是结构体,结构体里有指针。在一个函数里定义了结构体变量,对结构体处理的函数都是封装成库了,也看不到具体的操作,在使用到结构体的函数结束时(执行return后)出现该中断,设断点跟踪...太复杂了看不懂哪里的问题,接着在网上找了一堆相关的中断,有的说是内存分配不够,vs上的/RTC检查了此操作所以报错出来。

    再找了一些网站。有的说msvc在debug下为栈上自动变量周围分配了一些保护空间。如果发生栈溢出, 就会写到保护空间上去。这样, 栈溢出就能被检查出来。然后我换成Release编译(太天真了),提示说是以前版本的,无法生成*&%……%#@!*       

    继续找...有的说把“c/c++代码生成这项”的"两者(/RTC1,等同于 /RTCsu)"改为“默认值”错误会消失,在项目属性那里,我改了...完全没有变化。

    再继续找...说是发现有这样的说法“不一定在函数这个地方返回时弹出了错误,就是这个地方的原因,错误报的是堆栈遭到了破坏,所以你要查看你所有动态申请内存的地方是否存在堆栈溢出的情况。函数返回的时候,需要检查内存中的堆栈,所以出了错误,并不代表这个函数引发的错误。还有内存空间的回收看是不是有操作不当的情况。”。但是我的结构体操作函数都封装在库里面,看不到怎么办呢?继续看下去,发现有说到“我刚在再试了试,把bmpinfo改成类成员变量,而不是在这个函数的局部变量 ”“应该是结构体在内存字节对齐的原因  填充BITMAPINFO结构体的时候可能存在越界  我猜可能是这个    没有测试不好说”

    我按照上面的做法,试着把中断的变量定义到类中...还真没错误了。

最终解决方法我是在下面这个网址看到的:

http://topic.csdn.net/u/20090506/12/121d76ad-940a-4ad6-8b93-0c0bf1d80d69.html

    由于看不到具体的结构体操作,我想应该是调的库文件的问题,因为是以前的版本,容易出现这样的错误。虽然不知道为什么可以这样解决,但是没有这个问题了,也差不多了,希望对于和我一样的新手有帮助~

原创粉丝点击