zoukankan      html  css  js  c++  java
  • Struct member in Memory offset calc

    If you wrote some struct whatever in C or C++ style.

    Please be careful for those in memory bug.

    1)结构体的内存变换判断
    struct  strA{
    int a;
    int b;
    double c;
    };
    it was used by some software and give it to users.
    after sth happened, strA changed
    strA{
    int a;
    int b;
    double c;
    long d;
    };
    how to judge strA now hold "d" or not ?
    #ifdef  _WIN64
    #define  offsetof(s, m)     (size_t)((ptrdiff_t)&reinterpret_cast<const volatile char&>( (((s*)0)->m) ) )
    #else
    #define  offsetof(s, m)     (size_t)&reinterpret_cast<const volatile char&>( (((s*)0)->m) )
    #endif
    2.结构体升级(我指的是从C style,扩展到C++ style)
    有人看完上面,可能会发现这个部分没必要细究。但是我今天在软件中发现了个bug,在升级struct到C++ style时候,发现原来可以delete的,现在应为struct 有了虚析构函数后,delete内存crash。
    struct StrA{
    int a;
    int b;
    StrA(){memset(this, 0, sizeof(StrA));}//这里错误比较明显发现,我的情况是把它放在我需要set 0的时候做了,结果debug了半天才怀疑是这个问题。
    virtual ~StrA();
    };
     
    但我们 StrA *p = new StrA();
    xxxx
    NICE_REMOVE( p);//CRASH.
    原因:virtual 析构函数里的vptr这一指针在memset时置零了,这就意味着这个指针不能被使用,而delete p时,触发了这一危险。
    改进:1.不要virtual(愚蠢的)。2.不要构造函数(注意我的意思是不要对base struct用memset),同时set 析构函数为纯虚,然后memset操作给子结构体去new和delete,这一既保留了strA的核心功能,有可以避免虚函数表在基类的析构错误问题。
  • 相关阅读:
    各种推导式玩法
    游标实例
    点滴纪录
    Jquery和CSS--点滴精华总结
    Asp.net页面之间几种传值方法【示例】
    .net Repeater知识知多少
    SqlServer 知识标记
    从客户端(...)中检测到有潜在危险的Request.Form 值的处理办法
    Jquery获取html中select,radiobutton选中的值写法
    Javascript获取当前日期
  • 原文地址:https://www.cnblogs.com/erickingxu/p/3935623.html
Copyright © 2011-2022 走看看