2016-08-19 23 views
1

この例を考えてみましょう。割り当てられたオブジェクトのヒープには、メンバーがスタックに割り当てられますか?

class StaticlyManagedObject 
{ 
    //some class members.... 
} 
class DynamiclyManagedObject 
{ 
    StaticlyManagedObject _staticlyManagedObject; //is this still allocated at the stack? 

} 

class Foo 
{ 
    DynamiclyManagedObject * _dynamiclyManagedObject; //will be allocated in the heap. 
    Foo() 
    { 
     _dynamiclyManagedObject = new DynamiclyManagedObject(); 
    } 
} 

C++で動的メモリ管理を使用しないと、物事はスタックで割り当てられ、メモリ管理は必要ないと言われています。

ただし、この例では、 DynamiclyManagedObjectという名前の動的に割り当てられたオブジェクトがあります。このオブジェクトをFooコンストラクタ内でインスタンス化します。私の質問は、DynamiclyManagedObjectの静的に管理されたデータメンバーはどうなりますか?

DynamicmanManagedObjectがヒープで作成されたため、スタックのすべてのデータメンバーがヒープになるため、スタック上に作成されますか。

答えて

4

サブオブジェクトは、その一部である完全なオブジェクトと同じ記憶期間を持ちます。 DynamiclyManagedObjectのインスタンスが動的に割り当てられている場合、DynamiclyManagedObjectが破棄された場合、StaticlyManagedObjectのメンバーは破棄されます。

論理的には、完全オブジェクトがヒープ上にある場合にのみ、サブオブジェクトがヒープ上にあると言うことができます。ただし、保存期間は技術的に正しい方法です。ヒープとスタックは実装の詳細です。

+0

ありがとうございました。私が下にあるすべての答えは同じように素晴らしいです。ストレージの持続時間について言及していただきありがとうございます。クイック検索は非常に多くの回答を示しました。今私はそれについてもっと調べることができます。 – Nusakan

3

StaticlyManagedObjectは不適切です。親オブジェクトと同じように動的に割り当てられます。

ネストされたクラスメンバは、具体的にstaticというマークが付けられていない限り、親オブジェクトと同じ割り当て方法を使用します。オブジェクトの作成時に割り当てられない場合、またはコンストラクタ。

+0

「StaticlyManagedObject」が動的に割り当てられることを明確にしてくれてありがとう。 – Nusakan

2

あなたのクラスのメンバーが別のクラス、または基本データ型であるかどうか:

class DynamiclyManagedObject 
{ 
    StaticlyManagedObject _staticlyManagedObject; 
    int some_integer; 
}; 

クラスのメンバは、intとして、他のクラス、または基本データ型であるかどうかを問題ではありません。 。 "_staticlyManagedObject"と "some_integer"の両方は、型を除いて完全に同一です(もちろん、それはちょっとした属性ではありません)。 1つはintで、もう1つは他のクラスです。クラスメンバの型は、そのスコープに影響しません。クラス全体が動的に割り当てられるか、動的に割り当てられません。または、自動スコープで割り当てられます(スタック上に、あなたが言うように)。

ルールの唯一の例外は、staticクラスのメンバーである:

class DynamiclyManagedObject 
{ 
    StaticlyManagedObject _staticlyManagedObject; 
    int some_integer; 

    static std::string some_string; 
}; 

ルールはsome_string異なります。これは実際の静的クラスメンバであり、型がStaticallyManagedObjectであるクラスメンバではないことに注意してください。かかわらずタイプの

0

(その構造体、クラス、またはプリミティブである)、知っている、パラメータとしてあなたの構造体のサイズを取得のmalloc(とCにC++または動的割当てで新しいオペレータを使用して割り当てられるバイト数) - 必要なすべてのスペース(メンバーを含む)はヒープに配置されます。

これらの呼び出しは、割り当てられたヒープメモリゾーンへのポインタを返します。

ローカル関数の変数とパラメータは、常にスタックに配置されます。

ポインタローカル変数を宣言しても、その場所はスタックに残りますが、スタック割り当てポインタが実際に指すヒープメモリを割り当てるために、上記の動的割り当てメソッドを使用する必要があります。

関連する問題