Если класс объявляется следующим образом:
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);
}
Когда вы вызываете new
, он выделяется из кучи, в противном случае он выделяется из стек (игнорируем malloc
и ему подобные).
В вашем первом примере будет выделено пространство в обоих: 4 байта в стеке для экземпляра MyClass (при условии 32-битных указателей) и 250 байтов в куче для буфера, назначенного MyMember.
Во втором примере для экземпляра MyClass в стеке будет выделено 250 байтов. В этом случае MyMember рассматривается как смещение в экземпляре.
Раннее примечание: используйте std :: string
вместо выделенного кучи char [].
Распределенная память также выделяет 250 байтов во втором примере вместе с экземпляром класса?
Она будет распределена в куче в конструкторе, так же, как в стеке, выделенном MyClass. Это зависит от того, что вы подразумеваете под «вместе с», они не обязательно будут размещены вместе.
И будет ли член действителен в течение всего времени существования объекта MyClass?
Да.
Что касается первого примера, практично ли размещать члены класса в куче?
Да, в некоторых случаях. Иногда вы хотите минимизировать включения из файла заголовка, а иногда вы будете использовать фабричную функцию для создания члена. Однако обычно я использую простой элемент, не являющийся указателем.