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

时间:2010-05-12 15:51:09

标签: c++ stack memory-management heap

如果一个类声明如下:

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

可以这样做:

class MyClass
{
  char MyMember[250];
};

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

3 个答案:

答案 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被视为实例的偏移量。