多继承一题

侯捷 是我十分崇拜的一个智者。 他的著作和翻作一直十分喜欢。 他对技术是如此的执着和一丝不苟。

不太想写些c++的东西, 断章取义比较严重。 仅以微薄的知识分析一下, 断章取义一下。

class A {...};
class B{...};
class AB : public B, public A {...}

... (大概是main吧)
AB *pab = new AB();
A* pa = (A*)pab;
B* pb = (B*)pab;

delete pa;  (内存泄漏)


标准c++ delete 的语义是

1. 析购

2. 释放内存

惜购上比较复杂的, 关系到类到底有没有惜购函数(自定义也好, 编译器产生也好)和是否是虚拟惜购函数等等。

第一步 文中的delete 如果有惜购函数的话, 像这样
A:~A(pa); (A B都没有虚拟惜购, 当然没有惜购函数的话就不会有这个调用了)
AB:~AB(pa);  (A B都有虚拟惜购, 由于继承体系,基类的惜购函数会相继调用 )
A:~A(pa);  (A 没有虚拟惜购函数)

因为如果类有虚拟函数, 编译时刻, 在基栈上放置vptb, 而类的实例附加了vptr, vptr的指向, 决定了调用哪个虚拟函数。

这里可能是有泄漏的, 因为可能没有调用真确的惜购函数, 导致类内堆上分配的数据没有惜购。这是即使RAII惯用法也失效了。


第二步 释放内存的话, 肯定是泄漏的。
多继承的内存布局是这样的

B
A
AB

A* pa = (A*)pab; 这句和c有很大的差别, 编译器会介入,导致pa指向 AB类数据结构 的A

delete 的这部实作是 free((char*)pa); B段的数据没有释放。

delete pb; 那是安全的。 另外void* 转换的话, 编译器不会介入。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值