堆成员/栈上的类成员分配?
如果一个类声明如下:
class MyClass
{
char * MyMember;
MyClass()
{
MyMember = new char[250];
}
~MyClass()
{
delete[] MyMember;
}
};
它可以这样做:
class MyClass
{
char MyMember[250];
};
如何在堆上分配类,就像我做MyClass * Mine = new MyClass();
分配的内存是否也在第二个示例中分配了250个字节以及类实例? 该成员是否会在MyClass对象的整个生命周期内有效? 至于第一个例子,在堆上分配类成员是否可行?
是的,是的,是的。
不过,你的第一个例子有一点问题:这是因为它的一个数据成员是一个带有堆分配数据的指针,那么它也应该声明一个复制构造函数和赋值运算符,例如。 ..
MyClass(const MyClass& rhs)
{
MyMember = new char[250];
memcpy(MyMember, rhs.MyMember, 250);
}
早期注意:使用std::string
而不是分配char []的堆。
分配的内存是否也在第二个示例中分配了250个字节以及类实例?
它将在构造函数中分配,与分配MyClass的堆栈中的方式相同。 这取决于你的意思是“一起”,它不一定会一起分配。
该成员是否会在MyClass对象的整个生命周期内有效?
是。
至于第一个例子,在堆上分配类成员是否可行?
是的,在某些情况下。 有时候你想尽量减少头文件中的包含,有时你会使用工厂函数来创建成员。 通常情况下,我只需要一个简单的非指针成员。
当你调用new
它会从堆中分配,否则它将从堆栈中分配(我们将忽略malloc
及其类似)。
在您的第一个示例中,将在以下两者中分配空间:对于MyClass实例(假设为32位指针),堆栈中的4个字节以及分配给MyMember的缓冲区上的250个字节。
在第二个示例中,MyClass的实例将在堆栈上分配250个字节。 在这种情况下,MyMember被视为实例的偏移量。
链接地址: http://www.djcxy.com/p/14033.html