2016-12-02 4 views
-1

ローカルメソッド内でインスタンス化されたオブジェクトが格納されているのは不思議でした。私の知る限り、オブジェクトはヒープに格納され、その参照はスタックに格納されます。そうであれば、関数が返って、オブジェクトへの参照が存在しなくなる(関数のローカルスタックフレームがポップされているので)、オブジェクトはヒープに留まるか、手動で削除するかガベージコレクション、Javaのように)?メソッド内に作成されたオブジェクト

+1

あなたは、C++やJavaについて質問されていますか? 1つを選択し、あなたの質問から他のタグを削除します。 C++オブジェクトとJavaオブジェクトは根本的に異なります。一方に適用される回答は他方には適用されません。タグをスパムしないでください。 –

+0

両方の回答を得ることは役に立ちます。 –

+0

http://stackoverflow.com/questions/5836309/stack-memory-vs-heap-memory –

答えて

2

それはあなたがオブジェクトを返すと、その寿命が延長された場合、そのオブジェクトで何をするかによって異なります。一時的に作成すると、2つの結果が出る可能性があります。

  1. newでオブジェクトを作成した場合。新しいオブジェクトへのポインタを作成すると、メソッドが有効範囲外になったときにポインタが削除されます。しかし、オブジェクトはメモリリークの原因となり、オブジェクトは明示的に削除する必要があります。

  2. newを使用しない場合。スコープが終了すると、オブジェクトが削除されます。

これらの結果はどちらも、オブジェクトを返さず、関数内の一時オブジェクトとしてインスタンス化したと仮定しています。ここで

は、いくつかのサンプルコードです:

class ObjectClass { 
public: 
     ObjectClass() {} 

}; 

void myFunction() { 
     ObjectClass my_obj(); //memory is handled for you 
     ObjectClass * my_dynamic_obj = new ObjectClass(); 
     delete my_dynamic_obj; //if delete is not called then 
     // the pointer my_dynamic_obj will be deleted but the object itself will remain 
     return; 
} 

main() { 
     myFunction(); 
     return 0; 
} 
+0

新しいオブジェクトを使わずにオブジェクトを作成する方法はありますか? –

+0

はい、絶対に、標準的な方法で作成してください。例えば。 'ObjectClass my_obj()'私はあなたがJavaから来たと仮定しています。オブジェクトを削除しないとメモリリークを引き起こす可能性があるため、 'new'は危険です。私に10分を与えれば、私はPCに着いたら答えを整理します。 – TomJ

+1

私のチームには、「new」と「delete」を使用しないよう指示します。自動ストレージは常に優先されます。あなたが_動的にストレージを必要とするときは、正しい種類のスマートポインタを使用してください。すべてのルールには明らかに例外がありますが、責任を持ってルールを破る経験豊かな開発者と、経験豊かな開発者がルールを正しく破ることが必要です。 –

関連する問題