C++ 类成员存储

Posted

技术标签:

【中文标题】C++ 类成员存储【英文标题】:C++ class member storage 【发布时间】:2014-08-14 21:48:59 【问题描述】:

我刚收到一个关于 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 你的意思是不是这样吗? @LuchianGrigore 我的意思是“它的所有成员也动态分配”的说法是不正确的。但这并不意味着它们是分开分配的。 @Slava 你能举一个动态分配对象并且它的成员不在动态内存中的例子吗? @LuchianGrigore OP 发表声明的方式高度表明他认为他班级的每个成员都是动态分配的,就好像你轮流对他们每个人都调用了 new 一样,这就是声明Slava 否认了,当然,如果实例本身就是实例的每个成员都在动态内存中,因为实例只不过是它的成员:) 【参考方案1】:

在第一种情况下,对象及其成员在自动存储中。

在第二种情况下,对象及其成员在动态存储中。

您可以简单地将它们分别称为堆栈和堆,是的。

【讨论】:

在这种情况下,“琐碎”到底是什么意思? @dreamer 堆栈和堆是俚语 :) C++ 不知道这样的实现细节。我说的很琐碎,因为它是我们都使用的东西,但它不是 100% 正确的。 您是否暗示 C++ 内部以相同的方式存储两者,但唯一的区别是内存是否自动分配? @dreamer 不,我的意思是“堆栈”和“堆”不是标准的一部分。自动/动态存储是。见***.com/questions/9181782/…【参考方案2】:

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

【讨论】:

【参考方案3】: 当您创建 class1 时,编译器会在堆栈上保留大约 24 个字节来放置该对象。 当您创建 class_ptr1 时,对 new() 的调用会从堆中分配大约 24 个字节来放置该对象。

【讨论】:

【参考方案4】:

您的问题来自于您不太了解 C++ 中的类/结构。当你声明一个类时:

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

此类的任何实例都将是 one continuous block of memory 大小等于 sizeof(MyClass1) 其中每个字段将具有该块开头的一些偏移量。如果您考虑并理解它,那么您的问题的答案将是显而易见的。

【讨论】:

以上是关于C++ 类成员存储的主要内容,如果未能解决你的问题,请参考以下文章

c++ 在一个类成员数组中存储任意数量的不同类

当我在 C++ 中派生一个类时,它是不是会创建一个基类对象并将其作为我的成员变量存储在派生类中?

C++|详解类成员指针:数据成员指针和成员函数指针及应用场合

C++大纲及疑惑点三

C++大纲及疑惑点三

C++大纲及疑惑点三