我的 Visual Studio 2012 程序在调试中运行,在没有调试的情况下发布 (ctrl + F5) 但不发布。我该如何解决?

My Visual Studio 2012 program works in Debug, release without debug (ctrl + F5) but not release. How do I fix?

如上所述,我的程序在没有调试 (ctrl + F5) 的情况下可以在 Debug 和 Release 中运行,但是在简单的 Release 中不起作用。

澄清一下,我已经检查过是否有一些未初始化的变量,但我没有(据我所知,但我花了很多时间寻找)。

我相信已经将问题本地化了,在我看来,我遇到的情况非常奇怪。首先我设置断点如下图所示:

然后我运行程序发布了。顶部断点立即移动:

我觉得这很奇怪。现在请注意分配给 'n' 的编号 6302。这个数字是正确的,也是我希望通过的。现在请看我继续执行该程序。

我们的状态仍然很好,但后来变得更糟了。

'n' 更改为 1178521344,这弄乱了我的其余代码。

是否有人能够阐明这种情况,甚至更好地提供解决方案。

谢谢, 凯文

下面是函数的其余部分,如果有帮助的话:

</p> <pre><code>NofArr = n; const int NA = n; const int NAless = n-1; double k_0 = (2*PI) / wavelength; double *E = new double[NAless]; // array to hold the off-diagonal entries double *D = new double[NA]; // array to hold the diagonal entries on input and eigenvalues on output int sizeofeach = 0; trisolver Eigen; int* start; int* end; vector< vector<complex <double>> > thebreakup = BreakUp(refidx, posandwidth, start, end); for(int j = 0; j < (int)thebreakup.size(); j++){ // load the diagonal entries to D for(int i =0; i < (int)thebreakup[j].size(); i++){ D[i] = -((double)2.0/(dx*dx)) + (k_0*k_0*thebreakup[j][i].real()*thebreakup[j][i].real()); } // load the off diagonal for(int i = 0; i < (int)thebreakup[j].size(); i++){ E[i] = (double)1.0 / (dx*dx); } sizeofeach = (int)thebreakup[j].size(); double *arr1= new double[sizeofeach]; arr1 = Eigen.EigenSolve(E, D, sizeofeach, mode); complex <double> tmp( PhaseAndAmp[j][1]*cos(PhaseAndAmp[j][0]), PhaseAndAmp[j][1]*sin(PhaseAndAmp[j][0])); // rebuild the break up with the mode for(int i = 0; i < (int)thebreakup[j].size(); i++){ thebreakup[j][i] = (complex<double>(arr1[i],0.0)) * tmp ; } delete []arr1; } vector<complex<double>> sol = rebuild(thebreakup, start, end); delete [] E; delete [] D; delete [] start; delete [] end; return sol;

我把它写成一个答案,因为它很难写成评论。

让我印象深刻的是数组 "arr1"

首先你分配新的内存并在变量arr1中存储一个指向它的指针

double *arr1= new double[sizeofeach];

然后,您立即覆盖该地址。

arr1 = Eigen.EigenSolve(E, D, sizeofeach, mode);

稍后,您删除了一些内容。安全吗?

delete []arr1;

不是你分配的double数组,而是eigensolve返回的东西。你确定你有权删除它吗?尝试在此处删除删除。另外,通过删除我给出的第一行中的分配来修复内存泄漏。


更让我担心的是"this"指针变了。某处有一些讨厌的问题。此时,您的程序已经损坏。在其他地方寻找问题。如果您可以尝试在 linux.

下编译,Valgrind 将是一个很棒的工具

您的程序中似乎正在进行某种代码优化。逐步调试优化代码并不总是那么容易,因为优化可能会重新排序指令。 我不明白为什么 'n' 更改为明显未初始化的值这一事实将成为问题的根本原因,因为 'n' 无论如何不再在您的函数中使用。似乎内存只是作为优化的一部分被释放了。

我发现了我的错误。在程序的早期,我比较的是指针,而不是它们所指向的东西。一个愚蠢的错误,但如果没有长时间的调试会话我是不会发现的。我的老板解释说,在 Visual Studio 底部给出的信息在发布模式下是不可信的。所以要 "debug" 我必须使用 std::cout 并以这种方式检查变量。

所以这里是代码中的错误:

if(start > end){
        int tmp = start[i];
        start[i] = end[i];
        end[i] = tmp;
    }

其中 startend 之前定义为:

int* start = new int[NofStacks];
int* end = new int[NofStacks];

并初始化。

感谢所有提供帮助的人,我觉得我必须为这个愚蠢的错误道歉。

修正为:

 if(start[i] > end[i]){
        int tmp = start[i];
        start[i] = end[i];
        end[i] = tmp;
    }