全局变量的陷阱

来源:互联网 发布:网络机房设备回收 编辑:程序博客网 时间:2024/05/21 11:16

问题描述:

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

原创粉丝点击