堆/堆栈上的类成员分配?
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早期注意事项:使用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 在“编辑不被注意到”时间范围内添加了它)。因此,就问题而言,这个答案根本不正确。但很遗憾,我无法删除它。以上是关于堆/堆栈上的类成员分配?的主要内容,如果未能解决你的问题,请参考以下文章