7

次のようなクラスがあるとします。

class Test
{
  int x;
  SomeClass s;
}

そして、私はそれを次のようにインスタンス化します:

Test* t = new Test;

x はスタックにありますか、それともヒープにありますか? sはどうですか?

4

6 に答える 6

19
Test a;
Test *t = new Test;

aとそのすべてのメンバーがスタックにあります。

tが指すオブジェクトとそのすべてのメンバーは、ヒープ上にあります。

ポインタtはスタック上にあります。

于 2008-10-09T15:27:27.923 に答える
10

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 なしで割り当てられたオブジェクトもヒープ上にありますが、ローカル メモリ内にあります。

申し訳ありませんが、これらの概念を表現するのにこれ以上の語彙がありません。

于 2008-10-09T16:02:05.903 に答える
6

を使用したのでnew、すべてがヒープ上にあり、[多かれ少なかれ]tのメモリ領域に連続して格納されています。

于 2008-10-09T15:27:03.227 に答える
5

tはスタック上にあります。*tのオブジェクトはヒープ上にあります。これには、ユニット内で隣り合ったintオブジェクトとSomeClassオブジェクトが含まれています。

于 2008-10-09T15:27:31.977 に答える
1

newを使用しているため、オブジェクトをヒープに割り当てています。その結果、tが指すテストのすべてのメンバーもヒープ上にあります。

于 2008-10-09T15:27:49.123 に答える
1
class MyClass {
    int i;
    MyInnerClass m;
    MyInnerClass *p = new MyInnerClass();
}

MyClass a;
MyClass *b = new MyClass();

a はスタックにあります。そのメンバー ai と am (am のメンバーを含む) と ap (それが指すオブジェクトではなくポインター) はその一部であり、スタック上にもあります。

ap が指すオブジェクトはヒープ上にあります。

b が指すオブジェクトは、そのすべてのメンバーを含めてヒープ上にあります。bp が指すオブジェクトも同様です。

于 2008-10-09T16:54:41.490 に答える