派生C ++类的内存分配

时间:2011-10-19 21:07:08

标签: c++ memory-management dynamic-memory-allocation

我正在设计一个小型系统,并且想知道如何为派生类分配内存的细微差别。

如果我有两个班级

class foo {
public: int a;
Foo(): a(0) {};
 };
class bar : public foo {
public: int b;
Bar() : Foo() , b(0) {}
};

然后在另一种方法中执行类似的操作

Bar* purple = new Bar();

我知道两个构造函数都会被调用(对于Foo和Bar)但是如何分配内存。是'a'和'b'同时分配的内存,因为它们都是Bar类的一部分,或者是在调用Foo构造函数时为'a'分配的内存和'b'的内存调用Bar构造函数时分配。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

sizeof(bar)足够大,可以包含sizeof(foo),并且所有内容都会在分配请求中分配。

答案 1 :(得分:2)

new Bar只是一个连续的分配,new Bar[n]也是如此。

这可能有点像这样想:

Bar* purple = new Bar();

类似

Bar* purple = (Bar*)malloc(sizeof(Bar));

在幕后,也会调用构造函数,在某些情况下,分配可能大于sizeof(Bar); new[]是一个常见的情况,它更大,因为在许多实现中,数组的计数被秘密存储在分配中。

<强>更新

sizeof Bar本身是存储类型所需的大小;它的成员,它的基础,指向它的vtable的指针等 - 都具有原生对齐(默认情况下)。编译器也可能引入填充。

因此,单个连续分配将足够大,以容纳foo和bar所需的所有内容,包括foo::abar::b

更详细:where are member-vars of a class on the heap stored?