2009-09-22 7 views
7
class A 
{ 
public: 
    A(); 
    ~A(); 
    int X; 
}; 

A::A() 
{ 
    X = 5; 
    int Y = 4; 
} 

//..... in another file 
A * objectOnHeap = new A(); 

この場合、「objectOnHeap」はヒープ上にあるため、特に新しいものではないにもかかわらずヒープ上のXですか?そしてこの場合、Yはスタックに割り当てられます(もちろん、範囲外になります)、正しいのでしょうか?ヒープ上にあるオブジェクトのメンバー変数も自動的にヒープ上にありますか?

オブジェクトがメモリにどのように格納されているかを考えようとしているときに、ワイヤを交差させてしまったのでしょうか?

+1

'objectOnHeap'はヒープ上に*ない*です。これはスタックまたはデータセグメントにあります。その値はポインタであり、*ヒープ上の何かを指すポインタです。 –

+0

@Rob Kennedy、データセグメントについて詳しく説明できますか?ポインタ自体はスタックにありますが、ポインタが指すデータはヒープに格納されていますが、私はあなたのポイントを見ています。 – BuckFilledPlatypus

答えて

17

はい。それはヒープです。基本的には、ヒープ上のオブジェクトに割り当てられた領域は、すべてのメンバー変数を保持するのに十分な大きさです。

5

はい、ヒープ上にあります。

いくつかの詳細: あなたは「新しい」演算子を使用する場合、何が起こるかはコンパイラがまたであるかもしれない(すべてのメンバ変数に必要なすべてのスペースを含め、クラスのヒープに十分なスペースを割り当てていることですクラス、そのサイズを計算する必要がある場合など)。

この後、コンストラクタはデータメンバクラスで呼び出され、次にクラス自体で呼び出されます。

ヒープ上にメモリを特別に割り当てない場合(通常、new演算子を使用するか、それを行う関数を呼び出す)、メモリはスタック内に割り当てられます(例の変数yのように)。

3

あなたの質問の半分はまだ答えられていないと思います.Yがまだスタックに割り当てられているかどうか聞いていましたが、それは確かです。

0

Yはローカルに作成されるためスタックされています。 Xがヒープ上にあります。

関連する問題