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

smr*_*t28 2 c++

考虑以下代码:

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
}
Run Code Online (Sandbox Code Playgroud)

删除如何知道应该释放的内存从哪里开始?

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

eer*_*ika 6

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

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

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

如果使用非虚拟析构函数,则可以将起始地址传递给运算符(或者如果不使用,则说明您拥有UB),因此没有什么神秘之处。

如果是虚拟析构函数,则使用虚拟调度。编译器将以某种方式实现它以使其正常工作。通常,使用“ vptr”。