delete如何知道对象在内存中的起始位置
How delete knows, where the object starts in the memory?
考虑以下代码:
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"。
相关文章:
- 你好。。。id_public变量不应该给出结果为 81 和 86 吗?为什么它为两个派生类占用不同的内存位置?
- 内存所有位置 wxWidgets
- 为什么字符串的 move() 会改变内存中底层数据的位置?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 内存中类位置的成员是否取决于类成员在类定义中的位置?
- 向量的内存位置不连续
- 如何根据C++在同一内存位置重新初始化 C# 中的对象(还是自动完成)?
- 常量引用的内存位置
- C++强制变量到一个固定的内存位置
- 为什么未初始化的内存位置的值给出 -842150451 的值?
- 为什么存储在内存位置的值会发生变化?
- 在特定内存位置构造 c++ 对象
- 如果不初始化结构中的向量,它会自动为空还是具有随机内存位置的值?
- 如何识别内存泄漏的位置
- 内存位置出现Microsoft C++异常:std::out_of_range
- 函数,返回变量c++占用的内存位置的大小
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- delete如何知道对象在内存中的起始位置
- 无法在 Opencv 中显示图像导致内存位置
- 如何修复<程序名称>中的"<内存位置>未处理的异常。Visual Studio 2017 中的访问冲突写入位置<内存位置>"