今天同事在写了如下结构体:
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进行清零操作。