【问题标题】:C++ class member storageC++ 类成员存储
【发布时间】: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 否认了,当然,如果实例本身就是实例的每个成员都在动态内存中,因为实例只不过是它的成员:)

标签: c++ memory


【解决方案1】:

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

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

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

【讨论】:

  • 在这种情况下,“琐碎”到底是什么意思?
  • @dreamer 堆栈和堆是俚语 :) C++ 不知道这样的实现细节。我说的很琐碎,因为它是我们都使用的东西,但它不是 100% 正确的。
  • 您是否暗示 C++ 内部以相同的方式存储两者,但唯一的区别是内存是否自动分配?
  • @dreamer 不,我的意思是“堆栈”和“堆”不是标准的一部分。自动/动态存储是。见stackoverflow.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) 其中每个字段将具有该块开头的一些偏移量。如果您考虑并理解它,那么您的问题的答案将是显而易见的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-09
        • 2012-10-12
        • 2016-04-28
        相关资源
        最近更新 更多