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

char variable = 'x';  // the variable is a char whose value is lowercase x

printf("<%c>", variable); // print it with angle brackets around the character
23
задан kbirk 31 May 2012 в 15:28
поделиться

2 ответа

Я думаю, что вы путаете «распределение стека / кучи» и «автоматическую переменную».

Автоматические переменные автоматически уничтожаются при выходе из контекста.

Распределение стека - это факт, что память распределяется в стеке выполнения. И переменные, расположенные в стеке, являются автоматическими переменными.

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

Другими словами: переменные / члены, для которых нужно вызвать delete, не являются автоматическими переменными.

Наконец, член класса размещается в том же сегменте памяти его владельца.

В вашем коде:

  • A.m_B - автоматическая переменная. Если A в стеке, то B и A в куче, так же как и B.
  • B.m_i и D.m_i являются автоматическими переменными и будут размещаться в одном и том же сегменте памяти их владельца
  • Указатель C.m_D является автоматической переменной, но Указанный объект типа D не является, вы должны явно вызвать delete для указателя, чтобы удалить базовый объект. Таким образом, указатель C.m_D размещается в том же сегменте памяти, но не в основном объекте. Он будет очищен новым и будет в куче.

Итак:

  • Случай 1: Все в стеке и автоматически (то есть: уничтожается автоматически).
  • Случай 2: myA2 в куче, а не в автоматическом режиме (вам нужно delete myA2). Его член m_B2 является автоматической переменной, которая будет уничтожена при уничтожении myA2. Кроме того, поскольку myA2 находится в куче, m_B, как и любой член класса, находится в той же области памяти, что и куча.
  • Случай 3: myC1 находится в стеке и является автоматической переменной. Указатель на m_D тоже находится в стеке, но не объект, указанный в m_D, который выделяется нового в кучу.
  • Случай 4: То же, что и случай 3, но myC2 находится в куче и не является автоматическим. Поэтому вы должны удалить myC2 (который удалит m_D).
  • [+1139]
39
ответ дан Mesop 31 May 2012 в 15:28
поделиться

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

Случай 2: весь объект существует в куче, это означает, что все его члены лежат в куче.

Случай 3: объект целом существует в стеке. Хитрость в том, что это не D экземпляр класса, который является членом myC1, но указатель на B является физически членом myC1. Таким образом, член myC1 лежит в стеке и указывает на некоторый D экземпляр, который находится в куче.

2
ответ дан tonytony 31 May 2012 в 15:28
поделиться
Другие вопросы по тегам:

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