首页 > 代码库 > Struct member in Memory offset calc

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的核心功能,有可以避免虚函数表在基类的析构错误问题。

Struct member in Memory offset calc