虚析构函数的一个秘密
原来虚析构函数使得对象在前端开了4个字节的指针指向虚表,下面是我的验证函数:
#include
#include
using namespace std;
class A {
public:
A () {
char *sp = (char *)this;
cout << sizeof (A) << '\n';
memset (sp + 4, 'x', sizeof (A) - 4);
}
char a, b, c, d;
virtual ~A () {}
};
int main()
{
A *p = new A;
char *str = (char *)p;
cout << p->a << p->b << p->c << p->d << endl;
delete p;
return 0;
}
输出:
8
xxxx
一开始我那里写成了memset (sp, 'x', sizeof (A)); 结果竟然弹出个windows报错窗口, 原来是因为这样会把已分配好的虚表地址变成"xxxx",恰好是个只读的内存,万一修改了其他程序的内存就麻烦了.