【发布时间】:2020-08-30 23:59:35
【问题描述】:
所以下面是一个while循环,它在调试中工作,但在发布模式下无限循环。
Ans FindMaxProj(PolyShape& S,Matrix<float,3,1>& N, Matrix<float,3,1>& cg, int StartInd){
MaxFound=false;
MaxIndInit=StartInd;
MaxValue=(cg+S.Verts.col(MaxIndInit)).transpose()*N;
while(!MaxFound){ //Infinitely loops in release mode, works in debug
MaxFound=true;
MaxInd=MaxIndInit;
for(int i=0; i<S.EdgeLinks[MaxInd].size();i++){
proj=(cg+S.Verts.col(S.EdgeLinks[MaxInd][i])).transpose()*N;
if(proj>MaxValue){
MaxFound=false; //Causes infinite looping in release mode
MaxValue=proj;
MaxIndInit=S.EdgeLinks[MaxInd][i];
}
}
MaxInd=MaxIndInit;
}
MaxCall.Value=MaxValue;
MaxCall.Ind=MaxInd;
return MaxCall;
}
我知道它会无限循环,因为如果我为发布模式添加迭代上限,循环将成功结束。 S.EdgeLinks 是 int 向量的向量。我正在使用 Eigen 进行矩阵数学运算。此外,传入的 S 是一个外部变量。此外,我正在使用具有默认编译器设置的 CodeBlocks。如果我应该提供更多信息,请告诉我。
【问题讨论】:
-
是的,您需要更多信息。为什么?因为任何时候某些东西在调试中“有效”而在发布中“无效”,您的程序中的某处就有未定义的行为。换句话说,您对数据或程序的实际行为所做的一些假设是错误的。因此,您对它发生在此函数中的假设也可能是错误的。
-
感谢您的提示。对于发现这种未定义的行为有什么建议吗?
-
是的,学习使用 IDE 的调试功能或使用单独的调试器来单步调试程序并检查其行为。或者,在此循环中输出关于正在选择的 what 索引以及该图形节点包含的 what 的信息。如果找不到,请开始将对象生命周期视为问题的潜在根源(例如我的某个对象是否被删除?我是否使用过时的指针?)。如果您仍然找不到它,请继续寻找数据损坏(例如我是否写到某个缓冲区的末尾并损坏了堆或堆栈?)
-
顺便说一句,如果您使用
std::vector或类似容器,您可以尝试将所有索引访问vec[i]转换为范围检查访问vec.at(i),这将在以下情况下抛出异常超出范围。保持这种方式通常不是一个好主意,但它可以帮助您找到溢出,我的直觉告诉我这可能是这里发生的事情。 -
感谢 at 的建议,但似乎事情的索引很好。愚蠢的问题,但是您知道在 CodeBlocks 中使用释放模式时我将如何输出整数吗?我尝试在网上查找,但似乎 CodeBlocks 已经不再使用很多了。
标签: c++ infinite-loop release-mode debug-mode