考虑以下代码:
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 如何知道应该释放的内存从哪里开始?
由于所有类仅包含原子整数,因此在这种特殊情况下是否需要虚拟析构函数?
最佳答案
is virtual destructor needed in this particular case?
是的。通过指向具有非虚拟析构函数的基类的指针删除对象具有未定义的行为。
How delete knows, where the object starts in the memory?
如果是非虚拟析构函数,您将起始地址传递给操作符(或者如果不这样做,那么您就有 UB),所以没有什么神秘的。
如果是虚拟析构函数,则使用虚拟调度。编译器将以某种方式实现它以使其正常工作。通常,使用“vptr”。
关于c++ - delete 如何知道对象在内存中的起始位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58507257/