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的核心功能,有可以避免虚函数表在基类的析构错误问题。
  • 相关阅读:
    nm applet disable
    profile和bash
    gre tunnel
    Redux
    react 组件架构
    Flux reference
    Controller View 模式
    Flux
    react事件代理
    虚拟dom和diff算法
  • 原文地址:https://www.cnblogs.com/erickingxu/p/3935623.html
Copyright © 2011-2022 走看看