树上小屋

这是一个将艺术和工程融为一体的活计.

导航

虚析构函数的一个秘密

原来虚析构函数使得对象在前端开了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",恰好是个只读的内存,万一修改了其他程序的内存就麻烦了.

posted on 2006-08-11 21:37  euclid  阅读(178)  评论(2编辑  收藏  举报