Членское выделение класса на "куче"/стеке?

Если класс объявляется следующим образом:

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

И это могло быть сделано как это:

class MyClass
{
  char MyMember[250];
};

То, как делает класс, выделяется на "куче", как то, если я делаю MyClass * Mine = new MyClass(); Выделенная память также выделяет 250 байтов во втором примере наряду с инстанцированием класса? И участник будет допустим для целой жизни объекта MyClass? Что касается первого примера, действительно ли это практично для выделения участников класса на "куче"?

9
задан underscore_d 12 November 2017 в 04:50
поделиться

3 ответа

Да, да и да.

В вашем первом примере есть небольшая ошибка: поскольку один из его членов данных является указателем с данными, выделенными в куче, он также должен объявить конструктор копирования и оператор присваивания для например ...

MyClass(const MyClass& rhs) 
{
  MyMember = new char[250]; 
  memcpy(MyMember, rhs.MyMember, 250);
}
7
ответ дан 3 November 2019 в 00:59
поделиться

Когда вы вызываете new , он выделяется из кучи, в противном случае он выделяется из стек (игнорируем malloc и ему подобные).

В вашем первом примере будет выделено пространство в обоих: 4 байта в стеке для экземпляра MyClass (при условии 32-битных указателей) и 250 байтов в куче для буфера, назначенного MyMember.

Во втором примере для экземпляра MyClass в стеке будет выделено 250 байтов. В этом случае MyMember рассматривается как смещение в экземпляре.

1
ответ дан 3 November 2019 в 00:59
поделиться

Раннее примечание: используйте std :: string вместо выделенного кучи char [].

Распределенная память также выделяет 250 байтов во втором примере вместе с экземпляром класса?

Она будет распределена в куче в конструкторе, так же, как в стеке, выделенном MyClass. Это зависит от того, что вы подразумеваете под «вместе с», они не обязательно будут размещены вместе.

И будет ли член действителен в течение всего времени существования объекта MyClass?

Да.

Что касается первого примера, практично ли размещать члены класса в куче?

Да, в некоторых случаях. Иногда вы хотите минимизировать включения из файла заголовка, а иногда вы будете использовать фабричную функцию для создания члена. Однако обычно я использую простой элемент, не являющийся указателем.

3
ответ дан 3 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: