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的核心功能,有可以避免虚函数表在基类的析构错误问题。
  • 相关阅读:
    bzoj 1031: [JSOI2007]字符加密Cipher
    [BZOJ5011][JXOI2017]颜色
    [BZOJ4765]普通计算姬(分块+树状数组)
    [BZOJ3261]最大异或和(可持久化Trie)
    [BZOJ4861][BJOI2017]魔法咒语(AC自动机+矩阵优化DP)
    [BZOJ2286][SDOI2011]消耗战(虚树DP)
    [BZOJ2109][NOI2010]航空管制(贪心+拓扑)
    [BZOJ1305][CQOI2009]跳舞(网络流)
    [Nescafé41]编码病毒(循环卷积)
    [Nescafé41]异化多肽(多项式求逆元)
  • 原文地址:https://www.cnblogs.com/erickingxu/p/3935623.html
Copyright © 2011-2022 走看看