Элементы данных расположены в том же пространстве памяти, что и их объекты в C ++? - PullRequest
7 голосов
/ 09 октября 2008

Скажем, у меня есть такой класс:

class Test
{
  int x;
  SomeClass s;
}

И я создаю это так:

Test* t = new Test;

Х в стеке или куче? А как насчет s?

Ответы [ 6 ]

19 голосов
/ 09 октября 2008
Test a;
Test *t = new Test;

a и все его члены находятся в стеке.

Объект, на который указывает t, и все его члены находятся в куче.

Указатель t находится в стеке.

10 голосов
/ 09 октября 2008

Каждый раз, когда вы «создаете экземпляр» объекта / символа, используя новый (здесь мы говорим о 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 - Если «локальная» память находится в куче, то объект, выделенный без нового, также находится в куче, но все еще находится в локальной памяти.

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

6 голосов
/ 09 октября 2008

Поскольку вы использовали new, все это находится в куче, хранится [более или менее] непрерывно в области памяти t.

5 голосов
/ 09 октября 2008

т в стеке. Объект в * t находится в куче. Он содержит int и объект SomeClass рядом друг с другом в блоке.

1 голос
/ 09 октября 2008
class MyClass {
    int i;
    MyInnerClass m;
    MyInnerClass *p = new MyInnerClass();
}

MyClass a;
MyClass *b = new MyClass();

находится в стеке; его члены a.i и a.m (включая любые элементы a.m) и a.p (указатель, а не объект, на который он указывает) являются его частью, а также в стеке.

Объект, на который указывает a.p, находится в куче.

Объект, на который указывает b, находится в куче, включая всех ее членов; и так же объект, на который указывает б.п.

1 голос
/ 09 октября 2008

Поскольку вы используете new, вы размещаете свой объект в куче. Следовательно, все члены теста, на который указывает t, тоже находятся в куче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...