繁体   English   中英

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

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

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

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

我认为将问题本地化,我所遇到的事情非常奇怪。 首先,我设置了断点,如下图所示:

断点设置

然后,我运行发行版中的程序。 然后,最高断点立即移动:

移动断点

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

n = 6302

我们仍然处于良好状态,但随后情况变得最糟。

n爆炸

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

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

谢谢,凯文

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

 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;

这不是您分配的双精度数组,而是eigensolve返回的东西。 您确定您有权删除它吗? 尝试在此处删除删除。 另外,通过删除我在第一行中分配的内存,也可以修复内存泄漏。


更让我担心的是“ this”指针发生了变化。 某处存在一些令人讨厌的问题。 此时,您的程序已经损坏。 在其他地方寻找问题。 如果您可以尝试在Linux下进行编译,那么Valgrind将是一个绝佳的工具。

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

我发现了我的错误。 在程序的早期,我比较的是指针,而不是指针所指向的指针。 这是一个愚蠢的错误,但是如果不进行长时间的调试,就不会发现这个错误。 我的老板解释说,在发布模式下,Visual Studio底部提供的信息不可信。 因此,要“调试”,我必须使用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;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM