問題描述:
程序是基於MFC對話框,在dlg.cpp中定義了大批的全局變量:靜態數組,整型,局部,結構體等。
這麼一個結構體:
enum
{
PATH_NUM = 3,
PATH_POINT_NUM = 33
};
定義了全局變量:
TrackPath g_trackPath; // 跟蹤區域
int g_trackPathId(0); // 當前操作的跟蹤區域
bool g_isDraw(false); // 是否顯示跟蹤區域
bool g_isSetPath(false); // 是否設置跟蹤區域
int g_activeStock(-1); // 當前選擇的stock
LONG g_activeStockHandle(-1); // 當前選擇的stock句柄
CSize g_stockSize; // stock的大小
CRect g_stockRect; // 最大化的stock 初試在對話框中的位置
在全局函數中完成初始化以及重置:
注意在這個函數中直接使用了99數字。因爲枚舉變量 PATH_POINT_NUM * PATH_NUM = 99
當我把PATH_POINT_NUM 改成30以後。重新運行程序,發現效果差距天壤之別,該顯示的內容都沒有顯示。
原因分析:
仔細調試發現ResetTrackPath函數中memset越界,導致全局變量g_stockSize等變量也爲0。。。在全局變量存儲區中,所有變量是連續存儲的。
PATH_POINT_NUM 改成30以後,memset整整越界了有9*2*sizeof(int) = 64個字節
全局變量連續存儲:
TrackPath g_trackPath;
int g_trackPathId(0); sizeof (int) == 4
bool g_isDraw(false); sizeof (bool) == 1
bool g_isSetPath(false); sizeof (bool) == 1
int g_activeStock(-1);
sizeof (int) == 4
LONG g_activeStockHandle(-1); sizeof (long) == 8
CSize g_stockSize; sizeof (CSize) == 8
CRect g_stockRect; sizeof (CRect) == 16
g_trackPath後面所有全局變量總共佔字節數爲 42個字節,遠小於64。所以ResetTrackPath函數中把所有這些變量全部置爲0,bool變量置成false,CSize變爲0。。。悲劇就這麼誕生了。
History
20140206 - fix detail bug,