次のコードがある場合:
for (...) { A a; }
ヒープまたはスタックに割り当てられますか?
次のコードがある場合:
for (...) { A a; }
ヒープまたはスタックに割り当てられますか?
あなたが言う時:
for (...) { A a; }
変数 a は静的に構築されていません。それは次のようになります。
for (...) { static A a; }
実際、あなたのコードでは、 a はスタック上に作成された自動オブジェクトです。ただし、これは動的割り当てが行われていないという意味ではありません。A が次のように見える場合:
struct A {
A() { p = new char[100]; }
char *p;
};
あなたが言うとき:
for (...) { A a; }
ap のストレージはスタック上に作成されますが、ap が指すストレージは動的に作成されます。
スタック上。
メモリはヒープにのみ割り当てられますnew
(またはmalloc
、C++ ではすべきではない C スタイルのことを行っている場合はその仲間)。
static
コードで変数を宣言していません。これはローカルにスコープされた変数であるため、スタックに配置されます。
変数はスタック上に作成されます。あなたのコードで:
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;
同じプログラマーが、その「静的変数」と「静的として宣言された変数」を呼び出すために使用します。
それは静的変数ではありません。また、スタックに A が割り当てられます。
変数は、明示的にnew
ed およびdelete
ed された場合にのみヒープに割り当てられます。
A は完全にスタックに割り当てられます。もちろん、A はその構築中にヒープからメモリを割り当てることができます。
static および const 変数は、特別な領域のスタックに配置されます。