全局變量的陷阱

問題描述:

程序是基於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,

發佈了218 篇原創文章 · 獲贊 94 · 訪問量 95萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章