全局变量的陷阱
来源:互联网 发布:网络机房设备回收 编辑:程序博客网 时间: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,
- 全局变量的陷阱
- 全局变量-陷阱
- C语言中全局变量赋值的陷阱
- 关于全局变量和局部变量的一个小陷阱
- '\'的陷阱
- :?的陷阱
- Delphi的接口陷阱
- TWebBrowser的Cache陷阱
- groovy 的陷阱
- 决策者的七大陷阱
- 公司政治的陷阱
- iterator的陷阱
- typedef的两个陷阱
- assert的陷阱
- 盖茨的陷阱
- EULA的陷阱
- typedef的陷阱
- find的小陷阱
- 最全的CSS浏览器兼容问题
- 【Mind Hacking】方法论、方法论——程序员的阿喀琉斯之踵
- Handling Java Memory Leak
- HACMP 4节点配置,同步时报错,dx过来看看
- 进销存系统数据库设计报告
- 全局变量的陷阱
- 深入浅出Android--Google手持设备应用程序设计-摘要
- oracle集合类型
- AIX5L_11GR2_rac_安装文档(STEP BY STEP)
- struts 2配置文件详解
- JDK,Tomcat,Apache安装与配置
- (转载)Android下 Affinities和Task
- tree
- AIX5L_11GR2_rac_安装文档(STEP BY STEP)