9

如果一个类声明如下:

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

它可以这样做:

class MyClass
{
  char MyMember[250];
};

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

4

3 回答 3

7

是的,是的,是的。

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

MyClass(const MyClass& rhs) 
{
  MyMember = new char[250]; 
  memcpy(MyMember, rhs.MyMember, 250);
}
于 2010-05-12T15:56:01.490 回答
3

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

分配的内存是否也分配了第二个示例中的 250 个字节以及类实例化?

它将在构造函数中堆分配,与在堆栈中分配 MyClass 的方式相同。这取决于您所说的“连同”是什么意思,不一定会一起分配。

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

是的。

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

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

于 2010-05-12T15:55:52.807 回答
1

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

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

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

于 2010-05-12T15:55:38.683 回答