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

如果一个类声明如下:

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

上一篇: Class members allocation on heap/stack?

下一篇: Advantages/disadvantages of auto pointers