2012-02-28 9 views
0

可能性の重複:いつ「新しい」を使うべきですか?

struct Graph { 
    int ID; 
} 
:私は以下の構造体を定義


When should I use the new keyword in C++?

私は、ケース1とケース2との違いを知りません

ケース1:

Graph g; 
g.ID = 1; 

ケース2:

Graph* g = new G(); 
g.ID = 1; 

は、これらの2つのケースは同じですか?違いは何ですか?

+0

ありがとうございました! – LoveTW

+1

'struct'定義の最後にセミコロンを追加すると、ケース1がコンパイルされることがあります。 –

答えて

3

は、Gが使用するメモリは、関数は、それが戻っているとき、それは自動的に解放されることを意味し、スタック上に割り当てられています。ケース2では

は、Gが使用するメモリは、明示的にdelete演算子を使用して削除したときにのみ解放されることを意味し、ヒープ上に割り当てられています。 、あなたは内、スタックのグラフを作成しているケース1内

g->ID = 1; 
1

ケース2では、あなたはnew Graph、その後g->ID = 1を意味します。 http://en.wikipedia.org/wiki/New_(C%2B%2Bから開始してください)。短文では、ケース1はコンパイル時にメモリを割り当て、ケース2は実行時に割り当てます。

1

違いは、データがどこに割り当てられているかです。

は、ケース1では、あなたのグラフ構造体のデータがスタック上に割り当てられています。あなたは "g"という名前でアクセスします。

は、ケース2では、あなたのグラフ構造体のデータは、ヒープ上に割り当てられています。そのデータへのポインタを使用してアクセスします。このデータは、名前 "g"で保持されています。ケース1では

1

:>演算子 - 使用

gがポインタであるので、また、ケース2内に、あなたがGのフィールドにアクセスしなければなりませんローカルスコープ。したがって、スコープが終了すると自動的に削除されます。したがって、gはそのグラフの実際のインスタンス化されたバージョンです。第2のケースで

、あなたはヒープへのグラフを割り当てています。 gはポインタだけであり、明示的に行うまでは削除されません。

+0

ヒープとスタックはこの文脈では有用な概念ではありません。あなたが探している用語は、自動ストレージの持続時間と動的ストレージの持続時間です。ヒープとスタックの問題は、オブジェクトのメンバーが動的に割り当てられていると状況が混乱することです。動的に割り当てられたオブジェクトは、メンバがヒープ上にあるにもかかわらずメンバ(ポインタでない場合)が(自動メンテナンス期間)であり、オブジェクトが破棄されたときに正しくクリーンアップされる間に、動的記憶期間を持ちます。 –

+0

確かにそれほど実用的ではありませんが、インタビューの中でこれらのプログラミングテストを受けるとき、ヒープとスタックの違いを知ることができます。 –

+0

はい、それは知っている(とあなたはその違いを知っておくべきである)すごいcompサイのことです。しかし、C++のコンセプトを説明する際には、私たちが完全ではありません。 –

関連する問題