Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ delete如何知道对象在内存中的起始位置?_C++ - Fatal编程技术网

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

C++ delete如何知道对象在内存中的起始位置?,c++,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如何知道应该释放的内存从何处开始 因为所有

考虑以下代码:

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”。

仅将
new
返回的指针(或空指针)传递到
delete
。否则您将有未定义的行为。在我的计算机上崩溃。代码中没有析构函数,甚至成员也没有析构函数。你确定,我必须创建一个人工虚拟的吗?另外,我想知道“编译器”是如何工作的。