Элементы данных выделяются в том же пространстве памяти как их объекты в C++?

URL-адрес ответа

https://accounts.google.com/o/oauth2/v2/auth?response_type=code&redirect_uri=https://vast-ridge-80091.herokuapp.com/auth/google/callback&scope=profile email&client_id=process.env.GOOGLE_CLIENT_ID

содержит ошибку client_id

client_id = process.env.GOOGLE_CLIENT_ID

[ 115] Вы должны заменить process.env.GOOGLE_CLIENT_ID на client_id

7
задан fluffels 9 October 2008 в 15:25
поделиться

6 ответов

Каждый раз, когда Вы "инстанцируете" объекта/символа с помощью нового (мы говорим 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 является указателем, выделенным с новым, объект, разработанный aa01:: c находится на "куче" в другом диапазоне памяти, чем тот, выделенный для aa01.

Заключение

Так, точка игры:
1 - Что является "локальной" памятью изученного объекта: Стопка "кучи"?
2 - если объект выделяется через новый, то это вне этой локальной памяти, т.е. это находится в другом месте на "куче"
3 - если объект выделяется "без нового", то это в локальной памяти.
4 - Если "локальная" память находится на стеке, то объект, выделенный без нового, находится на стеке, также.
5 - Если "локальная" память находится на "куче", то объект, выделенный без нового, находится на "куче" также, но все еще в локальной памяти.

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

10
ответ дан 6 December 2019 в 04:59
поделиться
Test a;
Test *t = new Test;

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

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

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

19
ответ дан 6 December 2019 в 04:59
поделиться

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

6
ответ дан 6 December 2019 в 04:59
поделиться

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

1
ответ дан 6 December 2019 в 04:59
поделиться

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

5
ответ дан 6 December 2019 в 04:59
поделиться
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, находится на "куче", включая всех ее участников; и так объект, на который указывает b.p.

1
ответ дан 6 December 2019 в 04:59
поделиться
Другие вопросы по тегам:

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