为什么将结构清零导致失去对虚拟基类成员的访问权限?

use*_*229 -5 c++ class visual-studio-2013

 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.


 }
Run Code Online (Sandbox Code Playgroud)

我可以从一个从虚拟基础派生的结构中访问成员.将结构清零时,它也会导致失去对成员的访问权限.这是否意味着我们必须单独清除成员而不是使用memset或ZeroMemory?

gex*_*ide 5

简短回答:未定义的行为.完全停止.

答案base很长: 是一个虚拟的基础ss.因此,在编译时未知从ss父项开头的偏移量base.offset必须在运行时检索此信息.信息存储在vtable对象的中.

因此,为了知道在字段的偏移base,所述vtable指针(驻留在对象内部)必须被考虑.你只需vtable 通过使整个结构为空来取消这个指针.因此,当它被取消引用以查找偏移时,一切都将要爆炸.偏移量base似乎偏离4了开头vtable,这就是你在地址处获得访问冲突的原因4.