我的 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;
}
其中 start
和 end
之前定义为:
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;
}
如上所述,我的程序在没有调试 (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;
}
其中 start
和 end
之前定义为:
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;
}