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

标签 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
}

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/

相关文章:

c++ - 将 QImage 转换为灰度

c++ - 如何获取硬盘驱动器的序列号

c++ - VBO 中的自定义三角形,如何渲染

c++ - 关于 GDB 和 CRC 不匹配

c++ - 如何让我的 mousehook 从单独的线程回调? C++

c++ - 如何在 C++ 中读取一个空文件?

c++ - 在 GMRES 中使用 C 或 C++ 中大型矩阵的矩阵 vector 乘积的更快方法

c++ - GTK Treeview 固定宽度

c++ - 什么是最好的自动完成/建议算法,数据结构 [C++/C]

c++ - 获取和设置不更新对象