如果一个类声明如下:
class MyClass
{
char * MyMember;
MyClass()
{
MyMember = new char[250];
}
~MyClass()
{
delete[] MyMember;
}
};
可以这样做:
class MyClass
{
char MyMember[250];
};
如何在堆上分配类,就像我MyClass * Mine = new MyClass();
一样
分配的内存是否也在第二个示例中分配250个字节以及类实例化?并且该成员在MyClass对象的整个生命周期内是否有效?
至于第一个例子,在堆上分配类成员是否切实可行?
答案 0 :(得分:7)
是,是,是的。
你的第一个例子中有一个bug,但是:因为它的一个数据成员是一个带有堆分配数据的指针,所以它还应该声明一个拷贝构造函数和赋值运算符,例如......
MyClass(const MyClass& rhs)
{
MyMember = new char[250];
memcpy(MyMember, rhs.MyMember, 250);
}
答案 1 :(得分:3)
早期注意:使用std::string
而不是堆分配的char []。
分配的内存是否也在第二个示例中分配250个字节以及类实例化?
它将在构造函数中分配,与分配MyClass的堆栈中的方式相同。这取决于你所说的“和”,它不一定会分配在一起。
该成员在MyClass对象的整个生命周期内是否有效?
是
至于第一个例子,在堆上分配类成员是否切实可行?
是的,在某些情况下。有时您希望最小化头文件中的包含,有时您将使用工厂函数来创建成员。通常,我只是使用一个简单的非指针成员。
答案 2 :(得分:1)
当你调用new
时,它会从堆中分配,否则它会从堆栈中分配(我们将忽略malloc
及其同类)。
在您的第一个示例中,将在两者中分配空间:堆栈中的4个字节用于MyClass实例(假设32位指针),堆上250个字节用于分配给MyMember的缓冲区。
在第二个示例中,将在堆栈上为MyClass实例分配250个字节。在这种情况下,MyMember被视为实例的偏移量。