Распределение элементов данных без указателя в C ++ в экземпляре класса указателя в куче или в стеке

0

У меня есть следующий класс:

class CObj {
private:
    MyOtherClass _member;
};

и следующий код, который создает экземпляр класса CObj:

CObj* obj = new Cobj;

obj выделяется в куче, но: Есть ли CObj :: _ элемент, выделенный в куче? или в стеке?

Теги:
pointers
memory

3 ответа

4
Лучший ответ

obj - указатель, выделенный "в стеке"; объект obj указывает на "на кучу" и, будучи obj->_member членом (= часть) такого объекта, он также находится в куче.

Как правило, члены, являющиеся частью родительского объекта, распределяются везде, где хранится их родитель.

  • 0
    объект находится в куче.
  • 0
    @IvanIshchenko Недостаточно кода, чтобы знать, где он находится, но он выглядит как автоматическое хранение или «стек». Вы думаете о том, что создано new , а не о самом obj .
Показать ещё 4 комментария
3

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

Проблема с такими вопросами заключается в том, что у C++ нет понятия стека и кучи - это просто продолжительность хранения.

  • 0
    _member не имеет автоматической продолжительности хранения; у него есть срок хранения объекта, который его содержит.
  • 0
    И, конечно, это не просто продолжительность хранения; есть также время жизни объекта (которое определяется при запуске конструкторов и деструкторов).
0

Когда вы вызываете new ОС, выделяйте столько же памяти, сколько размер класса в куче и вызове класса contructor.

Из этого вы можете видеть, что, поскольку MyOtherClass находится в CObj а CObj содержит MyOtherClass, MyOtherClass также находится в куче в том же пространстве, что и CObj.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню