我的 Visual Studio 2012 程序在 Debug 中工作,在没有调试的情况下发布 (ctrl + F5) 但不是发布。我该如何解决?
Posted
技术标签:
【中文标题】我的 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? 【发布时间】:2015-08-10 11:16:15 【问题描述】:如上所述,我的程序在没有调试(ctrl + F5)的情况下在调试和发布中工作,但在简单的发布中不起作用。
只是为了澄清一下,我已经检查过我是否有一些未初始化的变量,但我没有(据我所知,但我已经花了很多时间寻找)。
我认为问题已本地化,而我所遇到的情况在我看来非常奇怪。首先我设置断点如下图所示:
然后我在发行版中运行该程序。然后顶部断点立即移动:
我觉得这非常奇怪。现在注意分配给“n”的数字 6302。这个数字是正确的,也是我希望通过的。现在观看我继续执行该程序。
我们仍然处于良好状态,但情况变得最糟糕。
'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;
【问题讨论】:
[OT]:看来您可以通过 const 引用传递向量。E
和 D
可能是 std::vector<double>
而不是原始指针。
你确定NA
和thebreakup[j].size()
相等吗?
移动第一个断点的原因是前两个语句不生成代码——编译器只会在需要时用n
替换这些变量。与上一张图片类似 - 可能不再需要 n
并且编译器正在重用内存空间?
感谢@Jarod42 的回复,但我需要使用原始指针,因为我稍后在 LAPACK 中使用 E 和 D。而且breakup[j].size()的大小也不一样。
一旦需要double*
,您仍然可以使用std::vector::data()
。
【参考方案1】:
我写这个是为了回答,因为写评论比较难。
立即让我印象深刻的是数组“arr1”
首先分配新内存并将指向它的指针存储在变量 arr1 中
double *arr1= new double[sizeofeach];
然后,立即覆盖地址。
arr1 = Eigen.EigenSolve(E, D, sizeofeach, mode);
稍后,您删除了一些内容。安全吗?
delete []arr1;
这不是你分配的双精度数组,而是 eigensolve 返回的东西。您确定您有权删除它吗?尝试在此处删除删除。另外,通过删除我给出的第一行中的分配来修复内存泄漏。
更让我担心的是“this”指针发生了变化。某处有一些令人讨厌的问题。此时,您的程序已经损坏。在其他地方寻找问题。如果您可以尝试在 linux 下编译,Valgrind 将是一个很棒的工具。
【讨论】:
我玩过 arr1 但无济于事。我认为您对“this”指针是正确的。在发布问题之前,我尝试更改我的“this”指针。再次没有运气。只是为了更好地理解“this”指针,它只是我在头文件中的变量并且我在构造函数中初始化了吗? "this" 不应该改变 mid 函数,永远(?)。如果是这样,那就是非常严重的错误。很可能发生了内存损坏。最可能的原因是您释放了不应释放的内存。问题可能来自您在调用此函数之前所做的事情。你能生成一个我们可以测试的简单示例程序吗?我不知道要传递给你的函数。【参考方案2】:您的程序中似乎正在进行某种代码优化。逐步调试优化的代码并不总是那么容易,因为优化可能会重新排序指令。 我不明白为什么将“n”更改为明显未初始化的值这一事实将是问题的根本原因,因为无论如何您的函数中不再使用“n”。似乎内存只是作为优化的一部分被释放。
【讨论】:
【参考方案3】:我发现了我的错误。在程序的早期,我比较的是指针,而不是它们指向的东西。一个愚蠢的错误,但如果没有长时间的调试,我不会发现这个错误。我的老板解释说,在发布模式下,Visual Studio 底部给出的信息是不可信的。因此,要“调试”,我必须使用 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;
【讨论】:
以上是关于我的 Visual Studio 2012 程序在 Debug 中工作,在没有调试的情况下发布 (ctrl + F5) 但不是发布。我该如何解决?的主要内容,如果未能解决你的问题,请参考以下文章
如何删除 Visual Studio 2012 的 Blend?
无法在 Windows XP 上运行 Visual Studio 2012 程序
我可以在 Windows XP 上使用 Visual Studio 2010 远程调试器从 Visual Studio 2012 调试 .Net 4.0 应用程序吗?
我的 Visual Studio 2012 程序在 Debug 中工作,在没有调试的情况下发布 (ctrl + F5) 但不是发布。我该如何解决?