delete如何知道对象在内存中的起始位置

How delete knows, where the object starts in the memory?

本文关键字:位置 内存 何知道 对象 delete      更新时间:2023-10-16

考虑以下代码:

class Base1 { public: int a1; };
class Base2 { public: int a2; };
class Foo: public Base1, public Base2 {}
int main() {
Foo *foo = new Foo();
Base2 *b = foo; 
delete b; // note pointer foo != pointer b
}

delete怎么知道应该释放的内存从哪里开始?

由于所有类都只包含原子整数,在这种特殊情况下是否需要虚拟析构函数?

在这种特殊情况下需要虚拟析构函数吗?

是。通过指向具有非虚拟析构函数的基的指针删除对象具有未定义的行为。

delete如何知道对象在内存中的起始位置?

在非虚拟析构函数的情况下,您可以将起始地址传递给运算符(或者如果没有,则您有UB(,因此没有什么神秘之处。

在虚拟析构函数的情况下,使用虚拟调度。编译器将以某种方式实现它以使其正常工作。通常使用"vptr"。