2

スタックとヒープの違いは、ローカル関数のコンテキストで十分に文書化されていますが、インスタンス変数に興味があります。

インスタンス変数は解放されるまで残る必要があるので、作成したかどうかに関係なく、同じタイプのメモリに格納されnewますか?

すなわち

Class A{
  SomeType s1;
  SomeType * s2;
 }

これらが自動ローカル変数である場合、これら 2 つのメカニズムの違いはかなりのものです。しかし、インスタンス変数として、それらは多かれ少なかれメモリ内の同じ場所にあり、両方ともヒープ上にありますか?

4

2 に答える 2

4

A::s1定義により、インスタンスが作成される方法とA::s2場所に格納されます。Aが指すストレージの場所は、A::s2どこでもかまいません。

于 2013-04-12T11:58:06.007 に答える
2

非ポインター変数は、宣言されている方法または場所に応じて、ストレージ領域で定義されます。

Myclass obj;

関数スコープでは自動ストレージで作成されますが、グローバル スコープで作成された場合は静的ストレージ期間で作成されます。

あなたの例では、両方ともA::s1A::s2それらが属するオブジェクトと同じストレージ領域を持ちます。ただし、A::s2はポインターであるため、別のストレージ領域に配置されている可能性のあるオブジェクトを指している可能性があります。

例えば:

void doSomething()
{    
    A obj;
    SomeType obj2;
    obj.s2 = &obj2;
}

A::s2ストレージが と同じオブジェクトを指しますが、次のようobjになります。

void doSomething()
{
    A obj;
    SomeType *ptr = new SomeType;
    obj.s2 = ptr;
}

A::s2動的に割り当てられるオブジェクトを指します。

注: 上記のコードは、単純化のためのA::s2ものであると想定しています。public

于 2013-04-12T11:55:51.527 に答える