首页 > 其他 > 详细

使用类/结构体时关于ZeroMomery用法错误

时间:2014-02-24 00:17:26      阅读:514      评论:0      收藏:0      [点我收藏+]

今天同事在写了如下结构体:

bubuko.com,布布扣
1 typedef struct _tagInfo
2 {
3    std::list<int> lst;
4    std::vector<int> nVec;            
5 } INFO, *PINFO;
6 
7 typedef std::map<int, INFO*> Map_Info;
8 typedef std::map<int, INFO*>::iterator Map_Info_It;
bubuko.com,布布扣

在使用该结构体时

PINFO pInfo = new INFO();

ZeroMemory(pInfo, sizeof(INFO));

pInfo->lst.push_back(1);  //此处会出现崩溃,虚函数指针已经被清零,因此程序运行到这里会引起崩溃!

原因是如下:

在windows平台下,数组或纯结构使用ZeroMemory是安全的,而类(class)就使用构造函数进行初始化,不要调用ZeroMemory。
另外,如果一个类的结构中包含STL模板(Vector、List、Map等等),那么使用ZeroMemory对这个类的对象中进行清零操作也会引起一系列的崩溃问题(指针指向内存错误、迭代器越界访问等)。所以,再次强烈建议:类(class)只使用构造函数进行初始化,不要调用ZeroMemory进行清零操作。
在Windows编程中,ZeroMemory的作用是用0来填充一块内存区域,主要是你填充一些数据结构时把它们填为0比较保险,因为很多默认的参数取值为NULL,操作系统会替你解决。

使用类/结构体时关于ZeroMomery用法错误

原文:http://www.cnblogs.com/lisuyun/p/3561868.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!