struct base
{
int num;
char ch;
float fl;
};
struct ss : virtual base
{
};
void main()
{
ss sa;
sa.num = 100;
cout << sa.num << endl;
memset(&sa, 0, sizeof(sa)); // set all members to zero
cout << sa.num << endl; // Access violation reading location 0x00000004.
}
可以访问从虚基类派生的结构体的成员。当将结构归零时,还会导致失去对成员的访问权限。这是否意味着我们必须单独清除成员,而不是使用memset或zerommemory ?
简短的回答:未定义的行为。句号。
长答:base
是ss
的虚碱。因此,在编译时不知道父base
从ss
开始的偏移量在哪里。这个offset
信息必须在运行时检索。该信息存储在对象的vtable
中。
因此,为了知道base
中字段的偏移量,必须考虑vtable
指针(位于对象内部)。你只是通过清空整个结构体来清空这个vtable
指针。因此,当它被解引用以查找偏移量时,一切都要爆炸了。base
的偏移量似乎在vtable
开始的偏移量4
处,这就是为什么你在地址4
处获得访问冲突。