C++类成员存储

3
我是一名有用的助手,可以翻译文本。
我刚刚收到一个与C++类成员存储相关的问题。
例如,我有一个像这样的类:
class MyClass1{
    int a;
    int b[4];
    int c;
}

在主函数中:
int main(){
    MyClass1 class1;
    MyClass1* class_ptr1= new MyClass1();
}

那么成员a、b、c是如何存储的呢?对于class1,我认为所有成员都在堆栈中分配了空间,即使是数组b。

那么class_ptr1呢?显然它是动态分配的,即使它们不是指针,成员也是动态分配的吗?

非常感谢。

非常感谢回复。现在我明白了,一旦类被动态分配,所有成员也都是动态分配的。在这种情况下,我需要做些什么来释放它们,一旦我使用完类?我的意思是,只需要:

delete(class_ptr1);

或者我需要先释放它的成员。


现在我明白了,一旦类被动态分配,它的所有成员也都是动态分配的。你的理解是错误的。请看我的回答。 - Slava
@Slava,你是在暗示这不是事实吗? - Luchian Grigore
@LuchianGrigore 我的意思是说,“所有成员也是动态分配的”这个说法是不正确的。但这并不意味着它们是单独分配的。 - Slava
@Slava,你能举个动态分配对象的例子吗?它的成员不在动态内存中。 - Luchian Grigore
1
@LuchianGrigore OP表述的方式非常暗示他认为类的每个成员都是单独动态分配的,就好像你轮流调用了每个成员的new一样。这是Slava否认的陈述。当然,如果实例本身在动态内存中,那么实例的每个成员也在其中,因为实例本身不过是其成员而已 :) - Drax
显示剩余2条评论
4个回答

6
你的问题源于你不太理解C++中的类/结构体。当你声明一个类时,如下所示:

class MyClass1{
    int a;
    int b[4];
    int c;
};

任何此类的实例将是一块连续的内存块,大小等于sizeof(MyClass1),其中每个字段都具有该块开头的某个偏移量。如果你仔细思考并理解它,那么你的问题的答案将显而易见。

1
在第一种情况下,对象及其成员位于自动存储中。
在第二种情况下,对象及其成员位于动态存储中。
您可以将它们简单地称为堆栈和堆。

在这种情况下,“trivially”是什么意思? - dreamer
@dreamer "stack"和"heap"是俚语 :) C++不知道这样的实现细节。我之所以说它是微不足道的,是因为我们都在使用它,但它并不是100%正确的。 - Luchian Grigore
你是在暗示C++内部以相同的方式存储两者,但唯一的区别是内存是否自动分配? - dreamer
@dreamer 不,我的意思是“stack”和“heap”不是标准的一部分。自动/动态存储是标准的。请参阅http://stackoverflow.com/questions/9181782/why-are-the-terms-automatic-and-dynamic-preferred-over-the-terms-stack-and。 - Luchian Grigore

1

两个实例class1和*class_ptr1的内存布局相同,它们只是驻留在内存的不同部分 - class1在堆栈上,*class_ptr1在堆上。


1
  • 当您创建 class1 时,编译器在堆栈上保留了约24个字节以放置该对象。
  • 当您创建 class_ptr1 时,调用 new() 分配了约24个字节的堆空间以放置该对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接