【问题标题】:How delete knows, where the object starts in the memory? [duplicate]delete 如何知道对象在内存中的起始位置? [复制]
【发布时间】:2026-01-07 17:25:02
【问题描述】:

考虑以下代码:

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 如何知道应该释放的内存从哪里开始?

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

【问题讨论】:

  • 只将new返回的指针(或空指针)传递给delete。否则你有未定义的行为。
  • 我的机器崩溃了。

标签: c++


【解决方案1】:

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

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

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

在非虚拟析构函数的情况下,你将起始地址传递给操作符(或者如果你没有,那么你有 UB),所以没有什么神秘的。

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

【讨论】:

  • 代码中没有析构函数,甚至成员也没有析构函数。你确定,我必须创建一个人工虚拟的吗?另外,我想知道“编译器以某种方式......”是如何工作的。