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?
简短回答:未定义的行为.完全停止.
答案base很长:
是一个虚拟的基础ss.因此,在编译时未知从ss父项开头的偏移量base.offset必须在运行时检索此信息.信息存储在vtable对象的中.
因此,为了知道在字段的偏移base,所述vtable指针(驻留在对象内部)必须被考虑.你只需vtable 通过使整个结构为空来取消这个指针.因此,当它被取消引用以查找偏移时,一切都将要爆炸.偏移量base似乎偏离4了开头vtable,这就是你在地址处获得访问冲突的原因4.