Когда объект создается статически внутри функции, будет ли он размещаться в куче или в стеке? - PullRequest
1 голос
/ 19 февраля 2010

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

для (...) {A a;}

будет ли размещаться в куче или в стеке?

Ответы [ 7 ]

8 голосов
/ 19 февраля 2010

Когда вы говорите:

for (...) { A a; }

переменная a НЕ строится статически.Это будет:

for (...) { static A a; }

Фактически в вашем коде a - это автоматический объект, созданный в стеке.Однако это не означает, что динамическое распределение не происходит.Если A выглядело так:

struct A {
   A() { p = new char[100]; }
   char *p;
};

, то когда вы говорите:

for (...) { A a; }

, хранилище для ap создается в стеке, но хранилище, на которое указывает ap, создается динамически.

4 голосов
/ 19 февраля 2010

в стеке.

Память выделяется в куче только при выполнении new (или malloc и его друзьях, если вы делаете вещи в стиле C, чего не следует делать в C ++).

2 голосов
/ 19 февраля 2010

Вы не объявляете переменную static в своем коде - это переменная с локальной областью действия, и поэтому она окажется в стеке.

0 голосов
/ 19 февраля 2010

переменная создается в стеке.В вашем коде:

for (...) { A a; }

... И затем в конце любого цикла «for» переменная уничтожается автоматически (потому что она выходит из области видимости), как сказал Нил:

Нил Баттерворт: Фактически в вашем коде a является автоматическим объектом ...

Но если объект выполняет некоторые динамические выделения (IOW, onкучи) в течение своего жизненного цикла, тогда будьте внимательны, чтобы освободить память самостоятельно, либо в деструкторе А, либо снаружи.Пример C:

struct A {
  A(char *ptr);
  ~A();

private:
  char *p;
  int len;
};

A::A(char *ptr)
{
  len = strlen(ptr);
  p = (char *) malloc(len+1);
  if(!p) {
    exit(1);
  }
  strcpy(p, ptr);
}

A::~A()
{
  free(p);
}

Переменная p не освобождается автоматически, если вы не вызываете бесплатную процедуру.

Пока (и простите за мой английский)

PS: я бы хотел сказать, что слово «статически» так жестко раскритиковано в этом контексте, что это не так плохо, как они jkp и jldupont ...

jkp: " Слово"static немного вводит в заблуждение, это подразумевает использование ключевого слова static ...."

jldupont:" Вы не объявляете статическую переменную ...."

и так далее ...

jkp и jldupont на 100% правы , но в итальянском техническом языке некоторые программисты на C ++ используют слово " созданныйстатически"и" встроенные статически"для идентификации переменной будут созданы в стеке

Если вместо этого вы определяете статическую переменную, другими словами

static A a;

Те же программисты используют для вызова « статическая переменная » и « переменная, объявленная как статическая ».

0 голосов
/ 19 февраля 2010

Статические и постоянные переменные помещаются в стек в специальной области.

0 голосов
/ 19 февраля 2010

A будет полностью выделено в стеке. Конечно, A может выделять память из кучи во время ее построения.

0 голосов
/ 19 февраля 2010

Это не статическая переменная. Также А выделяется в стеке.
Переменные распределяются в куче, только если явно new ed и delete ed.

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