次のようなクラスがあるとします。
class Test
{
int x;
SomeClass s;
}
そして、私はそれを次のようにインスタンス化します:
Test* t = new Test;
x はスタックにありますか、それともヒープにありますか? sはどうですか?
次のようなクラスがあるとします。
class Test
{
int x;
SomeClass s;
}
そして、私はそれを次のようにインスタンス化します:
Test* t = new Test;
x はスタックにありますか、それともヒープにありますか? sはどうですか?
Test a;
Test *t = new Test;
aとそのすべてのメンバーがスタックにあります。
tが指すオブジェクトとそのすべてのメンバーは、ヒープ上にあります。
ポインタtはスタック上にあります。
new (ここでは 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 は new aa00 命令によって割り当てられたメモリ範囲内に割り当てられます。したがって、aa00::b もスタックに割り当てられます。
しかし、aa00::c は new で割り当てられたポインターであるため、aa00::c によって設計されたオブジェクトはヒープ上にあります。
さて、トリッキーな例: aa01 は new を介してヒープ上に割り当てられます。
その場合、aa01::b は aa01 に従って「ローカル」メモリに割り当てられるため、aa01::b は、新しい aa01 命令によって割り当てられたメモリ範囲内に割り当てられます。したがって、aa01::b はヒープ上にあり、aa01 に既に割り当てられているメモリの「内部」にあります。
aa01::c は new で割り当てられたポインタであるため、aa01::c によって設計されたオブジェクトはヒープ上にあり、aa01 に割り当てられたメモリ範囲とは別のメモリ範囲にあります。
したがって、このゲームのポイントは次のとおりです。
1 - 調査対象のオブジェクトの「ローカル」メモリは何ですか: スタック オブ ヒープ?
2 - オブジェクトが new によって割り当てられた場合、そのオブジェクトはこのローカル メモリの外にあります。つまり、ヒープの他の場所にあります
。
4 - 「ローカル」メモリがスタック上にある場合、new なしで割り当てられたオブジェクトもスタック上にあります。
5 - 「ローカル」メモリがヒープ上にある場合、new なしで割り当てられたオブジェクトもヒープ上にありますが、ローカル メモリ内にあります。
申し訳ありませんが、これらの概念を表現するのにこれ以上の語彙がありません。
を使用したのでnew
、すべてがヒープ上にあり、[多かれ少なかれ]t
のメモリ領域に連続して格納されています。
tはスタック上にあります。*tのオブジェクトはヒープ上にあります。これには、ユニット内で隣り合ったintオブジェクトとSomeClassオブジェクトが含まれています。
newを使用しているため、オブジェクトをヒープに割り当てています。その結果、tが指すテストのすべてのメンバーもヒープ上にあります。
class MyClass {
int i;
MyInnerClass m;
MyInnerClass *p = new MyInnerClass();
}
MyClass a;
MyClass *b = new MyClass();
a はスタックにあります。そのメンバー ai と am (am のメンバーを含む) と ap (それが指すオブジェクトではなくポインター) はその一部であり、スタック上にもあります。
ap が指すオブジェクトはヒープ上にあります。
b が指すオブジェクトは、そのすべてのメンバーを含めてヒープ上にあります。bp が指すオブジェクトも同様です。