轉載請注明出處:
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背了。
