【发布时间】:2014-02-13 10:30:03
【问题描述】:
我有一个 C++ 程序,当我在没有其他选项的情况下进行编译时运行良好。但是,每当我使用 cmake -DCMAKE_BUILD_TYPE=Release 时,代码中有一个非常具体的部分会停止工作。
具体来说,我有一个 Boost Fibonacci Heap 的接口。我正在调用这个函数:
narrow_band_.push(myObject);
这个函数做了以下事情:
inline void myHeap::push (myStruct & c) {
handles_[c.getIndex()] = heap_.push(c);
}
heap_ 在哪里:
boost::heap::fibonacci_heap<myStruct, boost::heap::compare<compare_func>> heap_;
由于某种原因 heap_size 没有被修改,因此其余代码不起作用,因为下一步是从堆中提取最小值并且它始终为空。
在调试模式下它工作正常。感谢您的帮助。
编辑 - 附加信息 我也发现了这个问题:我有一组代码可以进行简单的数学运算。在发布模式下,结果不正确。如果我只是对几个变量进行 cout 来检查它们的值,结果会发生变化,这仍然是不正确的,但很奇怪。
【问题讨论】:
-
确保永远不要将带有副作用的函数调用放在 assert() 中。我在那个上浪费了很多时间。
-
我没有使用 assert(),实际上我没有使用任何高级或错误检查功能。但感谢您提供的信息。
-
这应该是相关的:stackoverflow.com/questions/312312/…。也许它会有所帮助。
-
从该提议的帖子中我得到以下信息:如果使用 RelWithDebInf 编译错误消失(这是我的情况),那么它很可能是时间或初始化问题。但是,由于我在单线程程序中运行,我应该关心时间吗?实际上我发现其他数学运算并没有给出预期的结果。