GCC 在调试模式下崩溃,在发布模式下运行良好
GCC crash in debug mode, runs fine in release mode?
我有一个简单的循环,运行一系列基类指针:
Object * objects[2];
objects[0] = new GreenObject;
objects[1] = new RedObject;
objects[2] = new BlueObject;
for (int i = 0; i < 3; ++i) {
cout << i << " ";
objects[i]->info();
}
在调试模式下,程序在循环的第三次迭代中崩溃,在输出i
后立即,当调用info()
方法时。在发布模式下不会发生这样的事情,它正在正常运行。这不是对象的问题,因为即使我使用其他派生类,它也会锁定。
Windows 7 64位下的GCC 4.4.0
有什么想法吗?
这是
(和for
循环)超出数组的末尾:
objects[2] = new BlueObject;
导致未定义的行为。它在发布中运行的事实只是(不)幸运。未定义行为的一个子集是它的行为符合您的预期。
数组索引从0
运行到N - 1
,其中N
是数组中元素的数量。在objects
的情况下,有效索引仅0
和1
。将objects
声明更改为:
Object * objects[3];
访问objects[2]
是未定义的行为。
期望编程错误总是导致崩溃或明显故障是一个常见的错误。
未定义的行为意味着任何事情都可能发生,包括在某些情况下看起来有效。
如果你想要可预测的、可重复的行为,那么你应该编写正确的代码。
相关文章:
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 如何检测窗口当前是否正在运行模式对话框?
- 在调试模式下,所有程序都运行良好,但在发布模式下,我在cudaMalloc操作中出错
- 多线程程序卡在优化模式下,但在 -O0 中正常运行
- 如何在调试模式下通过终端运行可执行的 c++?
- 我在发布模式下运行时收到"Access violation reading location"错误 - C++
- C++单例模式代码无法运行,不知道为什么?
- 在CLION中调试模式和运行模式之间的怪异结果
- 如何创建一个新过程,而没有从管理模式运行的MFC应用程序中的管理特权
- 如何在单线模式下强制ROS运行
- 一般来说,使用Qt Creator,是什么导致程序在调试模式下编译时正确运行,但在发布模式下崩溃
- 在Visual Studio C 调试模式中捕获异常的最佳方法仅在从IDE运行时才会发生
- 64位VC 程序似乎在32位模式下运行
- 在非调试模式下运行代码时出现问题
- C++Win32 在低优先级模式下运行应用程序/线程
- GCC 在调试模式下崩溃,在发布模式下运行良好
- 可以从命令行运行C++代码,但不能从visual studio中的调试模式运行
- 在Visual Studio 2015中以C++98模式运行项目
- 在windows 7中用非管理模式运行的应用程序编写日志文件
- 设计模式- c++运行时成员参数的实例化