触屏玩街机总翻车?悟饭游戏厅用黑科技打破操作魔咒
81
2025-07-30
C++数组在内存中的布局与指针计算的机制,与多态存在根本冲突,不能同时使用。
数组在内存中是连续的,通过指针计算找到对应下标的成员:
一、多态与数组结合的灾难
当我们尝试将多态与数组结合,便会出现以下问题:
在循环里,「array」被认为是「Base 」类型的,所以实际的地址计算是「array + i * sizeof(Base)」。
但是我们通过多态传入了一个「Derived」类型的数组,显然「sizeof(Base)」和「sizeof(Derived)」的大小并不一样。最终循环会访问到「Derived」对象的内部地址,导致不可预测的错误。
二、删除多态数组的错误
看下面的代码:
「delete[]」的内部操作是循环调用数组对象的析构函数:
没错,「myArray[i]」这个指针计算操作又出现了,结果自然也是导致不可预测的错误。