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

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

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;

在使用该结构体时

PINFO pInfo = new INFO();

ZeroMemory(pInfo, sizeof(INFO));

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

原因是如下:

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