У меня есть следующий класс:
class CObj {
private:
MyOtherClass _member;
};
и следующий код, который создает экземпляр класса CObj:
CObj* obj = new Cobj;
obj выделяется в куче, но: Есть ли CObj :: _ элемент, выделенный в куче? или в стеке?
obj
- указатель, выделенный "в стеке"; объект obj
указывает на "на кучу" и, будучи obj->_member
членом (= часть) такого объекта, он также находится в куче.
Как правило, члены, являющиеся частью родительского объекта, распределяются везде, где хранится их родитель.
_member
имеет автоматическую продолжительность хранения - он выделяется там, где он владеет объектом. Итак, если вы создаете экземпляр CObj
с динамической продолжительностью хранения, как в вашем примере, он также будет выделен в динамическом хранилище (куче). Если вы создадите объект с автоматическим временем хранения, он будет находиться в стеке.
Проблема с такими вопросами заключается в том, что у C++ нет понятия стека и кучи - это просто продолжительность хранения.
_member
не имеет автоматической продолжительности хранения; у него есть срок хранения объекта, который его содержит.
Когда вы вызываете new
ОС, выделяйте столько же памяти, сколько размер класса в куче и вызове класса contructor.
Из этого вы можете видеть, что, поскольку MyOtherClass
находится в CObj
а CObj
содержит MyOtherClass
, MyOtherClass
также находится в куче в том же пространстве, что и CObj
.
new
, а не о самомobj
.