为什么将结构归零会导致对虚基类成员的访问丢失?


 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 ?

简短的回答:未定义的行为。句号。

长答:basess的虚碱。因此,在编译时不知道父basess开始的偏移量在哪里。这个offset信息必须在运行时检索。该信息存储在对象的vtable中。

因此,为了知道base中字段的偏移量,必须考虑vtable指针(位于对象内部)。你只是通过清空整个结构体来清空这个vtable指针。因此,当它被解引用以查找偏移量时,一切都要爆炸了。base的偏移量似乎在vtable开始的偏移量4处,这就是为什么你在地址4处获得访问冲突。

最新更新