问题描述:
程序是基于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,