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

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

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

 

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

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

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

    

 

posted @ 2021-06-15 18:43  dzqabc  阅读(156)  评论(0编辑  收藏  举报