1

次のコードがある場合:

for (...) { A a; }

ヒープまたはスタックに割り当てられますか?

4

7 に答える 7

8

あなたが言う時:

for (...) { A a; }

変数 a は静的に構築されていません。それは次のようになります。

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

実際、あなたのコードでは、 a はスタック上に作成された自動オブジェクトです。ただし、これは動的割り当てが行われていないという意味ではありません。A が次のように見える場合:

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

あなたが言うとき:

for (...) { A a; }

ap のストレージはスタック上に作成されますが、ap が指すストレージは動的に作成されます。

于 2010-02-19T13:36:12.120 に答える
4

スタック上。

メモリはヒープにのみ割り当てられますnew(またはmalloc、C++ ではすべきではない C スタイルのことを行っている場合はその仲間)。

于 2010-02-19T13:34:37.273 に答える
2

staticコードで変数を宣言していません。これはローカルにスコープされた変数であるため、スタックに配置されます。

于 2010-02-19T13:36:13.527 に答える
0

変数はスタック上に作成されます。あなたのコードで:

for (...) { A a; }

...そして、ニールが言ったように、「for」サイクルの終わりに、変数は自動的に破棄されます(スコープ外になるため)。

Neil Butterworth:実際、あなたのコードでは、aは自動オブジェクトです...

ただし、オブジェクトが自身のライフサイクル中に動的な割り当て(IOW、ヒープ上)を行う場合は、自分自身、Aのデストラクタ、または外部でメモリを解放することに注意してください。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);
}

freeプロシージャを呼び出さない場合、p変数は自動的に解放されません。

さようなら(そして私の英語でごめんなさい)

PS:この文脈で「静的に」という言葉は非常に厳しく批判されていると言いたいのですが、jkpやjldupontほど悪くはありません...

jkp:「「静的に」という言葉は少し誤解を招きやすいです。静的キーワードの使用を意味します。...

jldupont:"静的変数を宣言していません。。。。。 "

等々...

jkpとjldupontは100%正しいですが、イタリア語の技術用語では、一部のC ++プログラマーは、「静的に作成」および「静的に作成」という単語を使用して、変数がスタック上に作成されることを識別します。

代わりに静的変数を定義する場合、言い換えると

static A a;

同じプログラマーが、その「静的変数」と「静的として宣言された変数」を呼び出すために使用します。

于 2010-02-19T14:23:16.677 に答える
0

それは静的変数ではありません。また、スタックに A が割り当てられます。
変数は、明示的にnewed およびdeleteed された場合にのみヒープに割り当てられます。

于 2010-02-19T13:36:43.557 に答える
0

A は完全にスタックに割り当てられます。もちろん、A はその構築中にヒープからメモリを割り当てることができます。

于 2010-02-19T13:37:03.680 に答える
0

static および const 変数は、特別な領域のスタックに配置されます。

于 2010-02-19T13:53:07.033 に答える