gpt4 book ai didi

C++ 动态对象。运行时如何确定对象大小?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:57 24 4
gpt4 key购买 nike

我不明白一件事。例如,我声明 A 类和 B 类是 A 的子类:

class A {
public:
int a;
}

class B : public A {
public:
int b;
}

显然,如果我创建 A 或 B 的实例,它们在内存中的大小可以由类型决定。

A instanceA; // size of this will probably be the size of int (property a)
B instanceB; // size of this will probably be twice the size of int (properties a and b)

但是如果我创建动态实例然后释放它们呢?

A * instanceAPointer = new A();
A * instanceBPointer = new B();

这些是不同类的实例,但程序会将它们视为类 A 的实例。使用它们时没问题,但释放它们呢?要释放分配的内存,程序必须知道要释放的内存大小,对吗?

如果我写

delete instanceAPointer;
delete isntanceBPointer;

程序如何知道,从每个指针指向的地址开始,它应该释放多少内存?因为显然对象具有不同的大小,但程序认为它们是类型 A。

谢谢

最佳答案

我假设你知道怎么做 delete works .

至于delete 如何知道如何清理继承的实例。这就是你使用 virtual destructor 的原因在继承上下文中,否则你将有未定义的行为。基本上,析构函数与所有其他 virtual 函数一样,是通过 vtable 调用的。 .

还记得:C++ 编译器在你的析构函数中隐式地析构父类

class A {
public:
int a;
virtual ~A(){}
}

class B : public A {
public:
int b;
~B() { /* The compiler will call ~A() at the very end of this scope */ }
}

这就是为什么它会起作用;

A* a = new B();
delete a;

通过 vtable , 析构函数 ~B() 将被 delete 调用。由于编译器隐式地将基类的析构函数调用插入到派生类中,因此 A 的析构函数将在 ~B() 中调用。

关于C++ 动态对象。运行时如何确定对象大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37648205/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com