C++对象内存结构之虚指针

虚函数对于C++进行OO的作用毋庸置疑,下面通过一个简单的实例对虚指针进行深入讲解:

#include <cstring>

class VirtualClass
{
public:
	virtual void foo()
	{

	}
};

class NoVirtualClass
{
public:
	void foo()
	{

	}
};

int main(int, char *[])
{
	NoVirtualClass	*pObjA = new NoVirtualClass;
	VirtualClass	obj;
	VirtualClass	*pObjB = new VirtualClass;

	size_t nNoVirtual = sizeof(NoVirtualClass);
	size_t nVirtual = sizeof(VirtualClass);

	std::memset( pObjA, 0, nNoVirtual );
	std::memset( &obj, 0, nVirtual );
	std::memset( pObjB, 0, nVirtual );

	pObjA->foo();
	obj.foo();
	pObjB->foo();

	return 0;
}

类NoVirtualClass的大小为1,《深度搜索C++对象模型》有解释,类VirtualClass大小为4,因为对于有virtual函数的C++类,每个对象都有个叫做vfptr的指针,在VS2008中调试上述代码可以看到如下信息:

- __vfptr 0x00415740 const VirtualClass::`vftable' *
[0] 0x00411104 VirtualClass::foo(void) *

上面的三个memset分别进行如下操作:

30行那个将pObjA所指的内存区域置0,也就是将其所指的那一个字节清零。

31和32行都是将__vfptr置空。

下面三个函数调用,就很有意思了,尤其是第三个调用,直接出现内存违例。

大家可以把上述代码放到VS中调试跟踪一把,肯定会让自己对C++内存对象模型以及虚函数指针有一个更深的理解。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值