zoukankan      html  css  js  c++  java
  • 使用类/结构体时关于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,操作系统会替你解决。
  • 相关阅读:
    Girls and Boys
    Kindergarten
    codevs 2822 爱在心中
    Popular Cows
    QWQ
    2488 绿豆蛙的归宿(拓扑+dp)
    P1119 灾后重建
    Mr. Frog’s Game
    Basic Data Structure
    A strange lift
  • 原文地址:https://www.cnblogs.com/lisuyun/p/3561868.html
Copyright © 2011-2022 走看看