(原)Vs中debug和release結果不一致


轉載請注明出處:

http://www.cnblogs.com/darkknightzh/p/5598091.html

前兩天調試程序,出現了一個很蛋疼的問題,debug和release結果不一致。網上很多都說是變量沒有初始化,但是我這邊變量已經初始化了。

最后仔細檢查,找到了debug和release下代碼結果不一致的地方。將該部分代碼提取並簡化,如下所示:

 1 int MatrixPlusDiagVec(float* pMat, const float* pVec, int dim)
 2 {
 3     for (int i = 0; i < dim; ++i)
 4     {
 5         pMat[i * (dim + 1)] += pVec[i];
 6     }
 7     return 0;
 8 }
 9 
10 void ShowRowRes(const float* data, int len)
11 {
12     for (int i = 0; i < len; ++i)
13     {
14         cout << i << ' ' << data[i] << endl;
15     }
16 }
17 
18 int main()
19 {
20     int num = 250;
21     float* pa = new float[num * num];
22     memset(pa, 0, sizeof(float) * num * num);
23 
24     float* pb = new float[num * num];
25     for (int i = 0; i < num; ++i)
26     {
27         pb[i] = (i + 1) * 5;
28     }
29 
30     MatrixPlusDiagVec(pa, pb, num);
31 
32     ShowRowRes(pa, num);
33 
34     delete[] pa;
35     delete[] pb;
36 
37     system("Pause");
38 
39     return 0;
40 }

 

其實是很簡單的代碼,就是將一個向量中的元素放到一個矩陣對角線上,但是debug和release結果就是不一致。調用ShowRowRes后,由於顯示第一行結果,應該只有第一個元素非0,其他都是0。Debug下正常,release下前4個結果都不對。

Debug顯示第一行結果如下:

Release顯示第一行結果如下:

Release顯示第二三四行均為0,顯示第5行結果:

  上述程序中float改為int后,release下結果依舊不正常。

 

后來將MatrixPlusDiagVec函數中

pMat[i * (dim + 1)] += pVec[i];

改為

pMat[i * (dim + 1)] = pMat[i * (dim + 1)] + pVec[i];

或者

pMat[i * dim + i] += pVec[i];

或者在pMat[i * (dim + 1)] += pVec[i];之后加上一句cout

或者使用vs2015編譯程序,

結果都正確。無論如何也理解不了為啥。

由於不會看反匯編代碼,所以就不看了。

 

之后有人看了我用的vs的版本,如下:

建議更新到update5,更新了之后,也沒有問題了。如下:

因而,猜測原因應該是vs2013我用的那個版本的bug吧。

所以,如果程序無論如何也理解不了debug和release為啥結果不一致,那就。。。額,更新一下IDE吧。這個鍋,只能IDE背了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM