Inside the C++ Object Model 笔记1

Inside the C++ Object Model P73中讲到

不管使用memcpy()或memset(),都只有在“class 不含任何由编译器产生的内部members”时才能有效运行,否则会导致那些“被编译器产生的内部members”的初值被改写。比如:

 

#include <iostream> using namespace std; class Shape { public: Shape() { // 将vptr(虚函数地址表的地址) 置为0 memset(this, 0, sizeof(Shape)); } int m_i; public: virtual void fun() { cout << "Shape::fun()" << endl; } void fun(int i) { cout << "Shape::fun(int i)" << endl; } }; int main() { Shape *dr=new Shape(); dr->fun(5);// 没问题 dr->fun(); // 运行时出错(因为vptr为0了) return 0; }

 

运行到dr->fun();时出现  读取位置 0x00000000 时发生访问冲突 错误

你可能感兴趣的:(Inside the C++ Object Model 笔记1)