今天在調試MFC代碼的時候遇到了debug和release下運行結果不同的問題, 仔細檢查了2小時才發現原來是一個函數調用寫錯了:
不慎將memcpy打成了memccpy,
編譯運行都沒有問題,但是運行的時候總有異常。
原來
|
函數說明:memccpy()用來拷貝src 所指的內存內容前n 個字節到dest 所指的地址上。
而void *memcpy(void *destin, void *source, unsigned n); 只有三個參數。
如果只傳了3個參數給 memccpy, 那麼這一段的數據會陷入混亂, 並且debug和release下運行的結果也不同,都是不正確的。
我就順便總結一下我以前也遇到過這類問題的解決辦法吧, 歡迎大家交流、補充。
二)內存溢出
debug模式下 較大的數組或結構體分配的地址通常不是連續的, 如果往數組裏寫數據溢出了,在debug模式下會寫到一些無用的區域, 但是Release模式下很可能會寫到別的相鄰的數組中,打亂了別的數組裏的數據。
這時從結果來看,就會出現一些隨機的異常。
三)變量未初始化
由於Release模式下無法打斷點,我們可以把結果輸出到本地文檔,
用下面的代碼在release模式測試一下:
int a,b;
a = b;
{
FILE* fp = fopen("D:\\1.txt","a");
if (fp == NULL)
{
return;
}
fprintf(fp,"a= ");
fprintf(fp,"%d",a);
fclose(fp);
}
執行後,打開對應的 txt文檔看到 a= 11088576, 程序隨機分配了一個很大的數給a。
如果是debug模式呢?
程序會報警,這也是vs的一個優點。但如果在別的IDE上也可能不會報錯。
這也會造成隱患,使Release的程序運行異常。
綜上所述,如果程序運行在debug和release下的結果不同,那就要仔細檢查代碼了。