奇怪的"random"内部编译器错误在C++生成器 2010
Strange "random" internal compiler error in C++ builder 2010
我有一些代码可以将一堆 TNotifyEvents 放在一个向量中。
std::vector<TNotifyEvent> m_availableCallbacks;
这是应用程序主窗体的成员。在窗体构造函数中,它填充了事件。
m_availableCallbacks.push_back(ReadoutLastValue);
m_availableCallbacks.push_back(ReadoutCurrentDay);
m_availableCallbacks.push_back(ReadoutLastDay);
m_availableCallbacks.push_back(Readout7Days);
m_availableCallbacks.push_back(Readout1Month);
m_availableCallbacks.push_back(ReadoutChooseTimeSpan);
m_availableCallbacks.push_back(ReadoutAllData);
然后迭代此向量并用于创建弹出菜单并将通知事件分配给该弹出菜单中的元素。
在本地编译它没有问题。当我在构建服务器(运行 TeamCity 6.5)上编译它时,我在等于第二个push_back调用的行上收到内部编译器错误。
我尝试通过编辑 cbproj 文件在构建代理上本地禁用智能缓存预编译标头。这产生了一个成功的构建。因此,我从所有 cbproj 文件中删除了使用智能缓存预编译标头的指令并提交了更改。我告诉TeamCity进行一次干净的检出,我再次在同一个地方遇到了同样的内部编译器错误。奇怪的是,在失败的编译成功后运行新的编译,所以这感觉非常随机。
这是怎么回事?我习惯于在其他C++编译器中传递函数指针(由我自己装箱)。是 TNotifyEvents 的内部处理中断了,还是编译器不稳定且容易损坏?
查看其他采用 TNotifyEvents 的代码,它们不适用于引用或指针,所以我没有尝试。而且由于代码(编译时)按预期工作,这似乎不是问题。
更新:
我可以补充一点,TeamCity 的日志说,当我重新运行编译并且它成功时,前端.cpp文件(包含此代码)将被跳过。
[10:04:37]: [MakeObjs] CallTarget
[10:04:37]: [CallTarget] _CppDepCheck
[10:04:44]: [_CppDepCheck] MessageMap
[10:04:44]: [MessageMap] Skipping: ..., FrontEnd.cpp, ...
为了使它甚至工作,当发生内部编译器错误时,编译必须成功。否则它怎么能跳过编译文件,仍然神奇地出现并以编译形式使用?:)
更新2
经过调查,我可以确认这仅在以发布模式编译时发生。在发布中,它甚至发生在 IDE 中的本地计算机上。我试过摆弄这样的设置
- 禁用所有优化
- 生成最快的代码
- 外部类型文件
- 等等
在每次尝试之间清理构建。但ICE并没有消失。但是,我确实设法让它抱怨另一个文件中的另一个位置。将设置回以前的设置不会使错误返回到 FrontEnd.cpp 文件。这个编译器感觉有点摇摇欲坠:)
事实上,我开始让ICE遍布代码,并且必须重新启动IDE才能编译任何内容。
这似乎与 std::vector 有关。不确定它是自己损坏还是密件抄送处理的方式是问题所在。但是切换到 C 样式数组作为测试反而使 ICE 消失,它现在在调试和发布模式下都可以正常工作。
TNotifyEvent m_availableCallbacks[7];
我想避免这种情况,因为向向量添加新事件几乎只涉及一行代码。现在也会有更多的事情要记住要改变。但是,最好让应用程序编译。
如果我错误地认为这是密件抄送中的一个错误,请纠正我,以便我可以尽快回到使用矢量:)......否则我希望内河码头尽快解决这个问题。
- 无法在 Visual Studio 2010 中构建 Allegro C++ 程序
- Visual Studio 2013,错误 MSB8020:找不到 Visual Studio 2010 的生成工具
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 双线程应用比单线程应用慢 C++ (VC++ 2010 Express).如何解决?
- std::array initalization with Visual Studio 2010
- MSVC 2010 编译应用程序和 MSVC 2019 编译应用程序之间的行为差异
- 将代码从 32 位迁移到 64 位时出现问题 Visual Studio 2010
- 在 Visual Studio 2010(及更高版本)中定义包含或链接路径变量的位置
- Visual Studio 2010 单元测试:无法识别引用的项目类
- Visual Studio 2010 - C++ 致命错误 LNK1120: 1 个未解析的外部
- VisualStudio 2015 链接器查找 VS 2010 库
- C /FORTRAN项目由Visual Studio 2010/Intel 2013创建,将不会在Visual St
- 如何使 Visual Studio 2010 警告未使用的变量
- 如何解决错误 C2719 在 Visual Studio 2010 C++ 中不存在代码行时
- 代码 c++ VS 2010 中的 LPCWSTR 到字符串转换问题
- 按值传递的参数在 Visual Studio 2010, C++ 的调试器中显示为通过引用传递
- Visual Studio 2010 是否执行零初始化
- 从另一个CPP文件访问Form1的文本框,Visual C 2010
- 无法使用 Visual Studio 2010 和 Qt 版本 4.8.0 创建"Qt Gui Application"
- 从 Visual C++ 2010 中的单独线程调用消息框