delete如何找到多重继承对象的内存块起始地址

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了delete如何找到多重继承对象的内存块起始地址相关的知识,希望对你有一定的参考价值。

0.多重继承情况下,对象创建时会生成多个续表指针,用于转换成不同基类时的操作。

    为了实现不同基类都能通过偏移找到对应虚表,这种对象在转换成不同基类型时也就进行指针的偏移。具体内存布局可以参考:多重继承和void*的糗事

 

1.在内存释放时delete可以对多重继承对象的不同类型指针进行释放。 那delete如何找到这种类型的内存分配地址呢?

    实际上它是通过在虚表中埋了一个指针偏转的析构函数实现指针偏移到原始内存地址的。 而最终的内存释放操作就直接放到了析构函数中。

    就是一个特殊的函数<non-virtual thunk to child::~child>,这个函数的内容就是将this参数偏移,实现根据父类指针便宜出子类地址,然后调用对应的析构函数。

    

 

以上是关于delete如何找到多重继承对象的内存块起始地址的主要内容,如果未能解决你的问题,请参考以下文章

对象模型

C++中运算符new和delete的功能分别是啥?

理解虚基类多重继承的问题

理解虚基类多重继承的问题

多继承和代码块

第54课 被遗弃的多重继承(下)