Каждый раз, когда вы «создаете экземпляр» объекта / символа, используя новый (здесь мы говорим о C ++), для этого объекта будет выделена новая зона памяти. Если нет, он будет помещен в «локальную» зону памяти.
Проблема в том, что у меня нет стандартного определения для "локальной" зоны памяти.
Пример
Это означает, что, например:
struct A
{
A()
{
c = new C() ;
}
B b ;
C * c ;
}
void doSomething()
{
A aa00 ;
A * aa01 = new A() ;
}
Объект aa00 размещен в стеке.
Поскольку aa00 :: b выделяется в «локальной» памяти в соответствии с aa00, aa00 :: b выделяется в пределах диапазона памяти, выделенного новой инструкцией aa01. Таким образом, aa00 :: b также размещается в стеке.
Но aa00 :: c - это указатель, выделенный новым, поэтому объект, созданный с помощью aa00 :: c, находится в куче.
Теперь, хитрый пример: aa01 выделяется через новый, и, как таковой, в куче.
В этом случае, поскольку aa01 :: b выделяется в «локальной» памяти в соответствии с aa01, aa00 :: b выделяется в пределах диапазона памяти, выделенного новой инструкцией aa01. Таким образом, aa00 :: b находится в куче, «внутри» памяти, уже выделенной для aa01.
Поскольку aa01 :: c является указателем, выделенным с помощью new, объект, созданный с помощью aa01 :: c, находится в куче, в другом диапазоне памяти, чем тот, который выделен для aa01.
Заключение
Итак, смысл игры таков:
1 - Что такое «локальная» память об изучаемом объекте: стек кучи?
2 - если объект выделен через new, то он находится за пределами этой локальной памяти, то есть где-то в куче
3 - если объект размещен «без нового», то он находится внутри локальной памяти.
4 - Если «локальная» память находится в стеке, то объект, выделенный без нового, также находится в стеке.
5 - Если «локальная» память находится в куче, то объект, выделенный без нового, также находится в куче, но все еще находится в локальной памяти.
Извините, у меня нет лучшего словаря для выражения этих понятий.