MFC 堆棧溢出 test dword ptr [eax],eax ; probe page.


今天調試程序的時候,發現一個奇怪的問題,之前調試都沒問題的,今早加了一點東西,就出現錯誤,跳到調試位置,如下4行紅色部分

 

1 ; Find next lower page and probe
2 cs20:
3         sub     eax, _PAGESIZE_         ; decrease by PAGESIZE
4         test    dword ptr [eax],eax     ; probe page.
5         jmp     short cs10
6 
7 _chkstk endp
8 
9         end

感覺好奇怪,然后斷點調試,連程序的入口都沒進就出現了這個錯誤,好郁悶。

 

然后百度一下,原來是因為局部變量申請的空間過大,大於了1M。

局部變量的申請空間是存放於棧中,windows里默認棧內存是1M,所以當申請空間大於1M時就會出現溢出錯誤。

查看了一下源代碼,原來今天早上增加了一個結構體數組,數組超出堆棧的大小了。

在類中有如下定義:

    //色亮度數據
    struct LXY
    {
        float L; //亮度
        float x; //色度x
        float y; //色度y
    };

    LXY LxyData[HIGHTH][WIDTH]; //整個畫面數據
    

另外

1 #define WIDTH  640  //像素寬度
2 #define HIGHTH 480  //像素高度

這樣下來這個數組所占的空間為 640*480*(4+4+4)= 3686400B = 3600KB = 3.515625M

對於這種情況,解決辦法就是修改數組的定義,換成動態數組

1 CArray<LXY,&LXY> LxyData;

要么就是擴大棧空間的大小。

擴大空間堆棧大小的方法是

Project->Properties->Configuarations Properties->Linker->System->Stact Reserve Size

例如修改成5M,可以輸入5242880

1024*1024*5 = 5242880

這樣修改后程序就可以正常運行了。

 

倆兒子


免責聲明!

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



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