4
|
LeopardSkinPillBoxHat · 技术社区 · 14 年前 |
![]() |
1
3
通常,当您删除指向该内存的指针时,VC++调试器将填充具有已知值的堆分配内存。我使用Visual Studio已经有一段时间了,但是在我看来,0xcdcdcdcd可以是这样一个值是合理的。在我看来,应用程序在调试器中运行时很可能会正常崩溃。在释放模式下运行时,运行时不会浪费时间覆盖已释放的内存,因此有些时候您会“幸运”,并且存储在该内存中的数据仍然有效。 您可以修改生成设置,以启用在释放模式下用已知值填充已释放内存的选项(完成后不要忘记再次将其关闭)。我猜如果你这么做的话,你的应用程序会在释放模式下崩溃。 我很感激这个值并不总是0xcdcdcdcd,这可能意味着我错了,也可能意味着您有多个指向悬挂指针的路径。 |
![]() |
2
2
我几年前遇到的情况正好相反:问题只在调试器 不 附属的。 结果发现代码破坏了先前方法激活的堆栈框架,并且使用调试器引入了一个中间堆栈框架。 你可能也有类似的情况。 |
![]() |
3
0
我不知道这是否有帮助,但我曾经遇到一个错误,如果程序是在Visual Studio调试器下运行的,或者程序是在外部运行的,然后附加了调试器,则会出现不同的情况。 |
![]() |
4
0
我已经查出了这个问题的原因 this question 详细情况。 在调试器下运行我的测试工具时,调试环境消耗的内存意味着同一对象的后续分配/释放总是在 不同的 部分记忆。这意味着当我的测试工具试图访问一个悬挂的指针时,它会崩溃测试(技术上这是未定义的行为,但这是测试代码,它似乎做了我需要它做的事情)。 从命令行运行我的测试线束时,同一对象的后续分配/释放始终使用 相同的 内存块。这种共同的行为意味着当我访问测试用例中的一个悬挂指针时,悬挂指针仍然指向一个有效的对象。所以我没看到撞车。 |