【发布时间】:2011-05-26 21:11:36
【问题描述】:
我知道这可能是一生一次的问题,但我一直坚持下去,我想不出任何可能导致这个问题的问题,我用 C++ 编写了一个代码(大约 500 行单独类和文件)使用visual studio,当我在没有优化标志(/od)的情况下编译它时它工作正常,但是当我尝试使用发布配置(/o2标志用于优化)编译它时,程序会出现访问冲突和崩溃。经过一些调试后,我发现有一个this 值在一个成员函数内部发生了变化,但是如果指针发生变化,我看不到调用堆栈中指针的任何直接使用,任何人都可以给出任何建议是什么导致这种情况发生仅在启用优化时?
不知道这是否对您有帮助,但是当我使用优化进行编译时,我可以看到在我的第一个函数调用的末尾添加了一个汇编指令pop ebp不知道这是什么确实如此,但不管它是什么,这就是这个指针改变的地方。
我在尝试使用反汇编程序进行调试时发现了一些新的东西,有 13 条 push 指令,而导致问题的函数中只有 10 条 pop 指令(问题是由 @987654325 之前的最后一次弹出引起的@指令)可以吗? (我也在计算被调用的函数中的所有推送、弹出指令。)
【问题讨论】:
-
这可能是即使在调试版本中也存在的问题,但由于内存布局和损坏的内容,它可能不会出现。我会先梳理一下你是如何管理你的记忆的。查看所有动态分配和释放。
-
当我尝试在该函数(以及它调用的所有函数)中进行调试时,如果程序在没有优化的情况下编译,则没有内存限制,但我会仔细检查。
-
除此之外,我在该函数中使用的每一件事都通过多个项目进行了测试(它们是我在每个项目中使用的一些基类)
-
@Gajet,通常你会因为几种类型的问题得到这个,你已经释放了一些东西并再次访问它,或者你已经访问了缓冲区的末尾(检查字符串/数组的使用等.) 在不真正了解您的代码的情况下,很难说出问题出在哪里,我们所能做的就是提供一般性提示。
-
@Gajet,就像我说的,内存布局在调试和优化模式下可能不同,所以如果你有一个缓冲区溢出,例如,在调试模式下你可能很幸运,因为内存是访问仍然可以,但在优化模式下,它可能会遇到无法读取的地址。优化是一个红鲱鱼,相信我,编译器不太可能做一些愚蠢的事情......
标签: c++ visual-studio-2010 optimization assembly access-violation