堆/堆栈上的类成员分配?

Posted

技术标签:

【中文标题】堆/堆栈上的类成员分配?【英文标题】:Class members allocation on heap/stack? 【发布时间】:2011-02-18 17:07:21 【问题描述】:

如果一个类声明如下:

class MyClass

  char * MyMember;
  MyClass()
  
    MyMember = new char[250];
  
  ~MyClass()
  
    delete[] MyMember;
  
;

它可以这样做:

class MyClass

  char MyMember[250];
;

如何在堆上分配一个类,就像我这样做 MyClass * Mine = new MyClass(); 分配的内存是否也分配了第二个示例中的 250 个字节以及类实例化?并且该成员在 MyClass 对象的整个生命周期内都有效吗? 至于第一个例子,在堆上分配类成员是否可行?

【问题讨论】:

Class members and explicit stack/heap allocation的可能重复 【参考方案1】:

是的,是的,是的。

不过,您的第一个示例有一点错误:因为它的一个数据成员是一个带有堆分配数据的指针,所以它还应该声明一个复制构造函数和赋值运算符,因为比如...

MyClass(const MyClass& rhs) 

  MyMember = new char[250]; 
  memcpy(MyMember, rhs.MyMember, 250);

【讨论】:

感谢您的提示,我会考虑更频繁地使用此技术。 虽然技术上 Chris 是正确的,但这样做并不是一个好主意。改用 std::vector 并处理所有内存管理。查看完整详情:***.com/questions/255612/… 问题根本不是关于数组的,我应该改变这个例子,它是关于分配本身的概念。【参考方案2】:

早期注意事项:使用std::string 而不是堆分配的char[]。

在第二个示例中,分配的内存是否也与类实例化一起分配了 250 字节?

它将在构造函数中堆分配,与在堆栈中分配 MyClass 的方式相同。这要看你说的“连同”是什么意思,不一定要一起分配。

并且该成员在 MyClass 对象的整个生命周期内都有效吗?

是的。

对于第一个例子,在堆上分配类成员是否可行?

是的,在某些情况下。有时您想最小化头文件中的包含,有时您将使用工厂函数来创建成员。不过通常情况下,我只使用一个简单的非指针成员。

【讨论】:

感谢您提供如此详细的答案,至于早期的笔记,我只是想收集有关该主题的知识。【参考方案3】:

当您调用 new 时,它从堆中分配,否则它从堆栈中分配(我们将忽略 malloc 及其同类)。

在您的第一个示例中,将在两者中分配空间:堆栈上的 4 个字节用于 MyClass 的实例(假设为 32 位指针),堆上的 250 个字节用于分配给 MyMember 的缓冲区。

在第二个示例中,将在堆栈上为 MyClass 的实例分配 250 个字节。在这种情况下,MyMember 被视为实例的偏移量。

【讨论】:

这并不正确,在第二个示例中,该类包含一个 250 个字符的数组。如果您执行 MyClass *foo = new MyClass; 啊 - 我没有看到 new MyClass (或者可能是 OP 在“编辑不被注意到”时间范围内添加了它)。因此,就问题而言,这个答案根本不正确。但很遗憾,我无法删除它。

以上是关于堆/堆栈上的类成员分配?的主要内容,如果未能解决你的问题,请参考以下文章

静态成员存储在内存中的啥位置? C#.Net中的堆栈/堆[重复]

java语言中,类的成员变量分配在哪个内存区?

JAVA中的类成员变量是存在堆还是栈里面呀?

java内存分配(堆栈常量池)

何时为 C++ 中的类的成员函数分配内存空间?

C++ 通过分配其他构造函数初始化的类成员来初始化类成员是一个坏主意吗?