Распределение членов класса по куче / стеку? - PullRequest
9 голосов
/ 12 мая 2010

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

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

И это можно сделать так:

class MyClass
{
  char MyMember[250];
};

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

Ответы [ 3 ]

7 голосов
/ 12 мая 2010

Да, да и да.

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

MyClass(const MyClass& rhs) 
{
  MyMember = new char[250]; 
  memcpy(MyMember, rhs.MyMember, 250);
}
3 голосов
/ 12 мая 2010

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

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

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

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

Да.

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

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

1 голос
/ 12 мая 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...