VS程序debug和Release結果不同時的一些解決辦法

今天在調試MFC代碼的時候遇到了debug和release下運行結果不同的問題, 仔細檢查了2小時才發現原來是一個函數調用寫錯了:

不慎將memcpy打成了memccpy, 

編譯運行都沒有問題,但是運行的時候總有異常。

原來

void * memccpy(void *dest, const void * src, int c, size_t n);

函數說明: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下的結果不同,那就要仔細檢查代碼了。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章