可能性の重複:いつ「新しい」を使うべきですか?
:私は以下の構造体を定義struct Graph { int ID; }
私は、ケース1とケース2との違いを知りません
ケース1:
Graph g;
g.ID = 1;
ケース2:
Graph* g = new G();
g.ID = 1;
は、これらの2つのケースは同じですか?違いは何ですか?
可能性の重複:いつ「新しい」を使うべきですか?
:私は以下の構造体を定義struct Graph { int ID; }
私は、ケース1とケース2との違いを知りません
ケース1:
Graph g;
g.ID = 1;
ケース2:
Graph* g = new G();
g.ID = 1;
は、これらの2つのケースは同じですか?違いは何ですか?
は、Gが使用するメモリは、関数は、それが戻っているとき、それは自動的に解放されることを意味し、スタック上に割り当てられています。ケース2では
は、Gが使用するメモリは、明示的にdelete演算子を使用して削除したときにのみ解放されることを意味し、ヒープ上に割り当てられています。 、あなたは内、スタックのグラフを作成しているケース1内
g->ID = 1;
ケース2では、あなたはnew Graph
、その後g->ID = 1
を意味します。 http://en.wikipedia.org/wiki/New_(C%2B%2Bから開始してください)。短文では、ケース1はコンパイル時にメモリを割り当て、ケース2は実行時に割り当てます。
違いは、データがどこに割り当てられているかです。
は、ケース1では、あなたのグラフ構造体のデータがスタック上に割り当てられています。あなたは "g"という名前でアクセスします。
は、ケース2では、あなたのグラフ構造体のデータは、ヒープ上に割り当てられています。そのデータへのポインタを使用してアクセスします。このデータは、名前 "g"で保持されています。ケース1では
:>演算子 - 使用
gがポインタであるので、また、ケース2内に、あなたがGのフィールドにアクセスしなければなりませんローカルスコープ。したがって、スコープが終了すると自動的に削除されます。したがって、gはそのグラフの実際のインスタンス化されたバージョンです。第2のケースで
、あなたはヒープへのグラフを割り当てています。 gはポインタだけであり、明示的に行うまでは削除されません。
ヒープとスタックはこの文脈では有用な概念ではありません。あなたが探している用語は、自動ストレージの持続時間と動的ストレージの持続時間です。ヒープとスタックの問題は、オブジェクトのメンバーが動的に割り当てられていると状況が混乱することです。動的に割り当てられたオブジェクトは、メンバがヒープ上にあるにもかかわらずメンバ(ポインタでない場合)が(自動メンテナンス期間)であり、オブジェクトが破棄されたときに正しくクリーンアップされる間に、動的記憶期間を持ちます。 –
確かにそれほど実用的ではありませんが、インタビューの中でこれらのプログラミングテストを受けるとき、ヒープとスタックの違いを知ることができます。 –
はい、それは知っている(とあなたはその違いを知っておくべきである)すごいcompサイのことです。しかし、C++のコンセプトを説明する際には、私たちが完全ではありません。 –
ありがとうございました! – LoveTW
'struct'定義の最後にセミコロンを追加すると、ケース1がコンパイルされることがあります。 –