ローカルメソッド内でインスタンス化されたオブジェクトが格納されているのは不思議でした。私の知る限り、オブジェクトはヒープに格納され、その参照はスタックに格納されます。そうであれば、関数が返って、オブジェクトへの参照が存在しなくなる(関数のローカルスタックフレームがポップされているので)、オブジェクトはヒープに留まるか、手動で削除するかガベージコレクション、Javaのように)?メソッド内に作成されたオブジェクト
答えて
それはあなたがオブジェクトを返すと、その寿命が延長された場合、そのオブジェクトで何をするかによって異なります。一時的に作成すると、2つの結果が出る可能性があります。
new
でオブジェクトを作成した場合。新しいオブジェクトへのポインタを作成すると、メソッドが有効範囲外になったときにポインタが削除されます。しかし、オブジェクトはメモリリークの原因となり、オブジェクトは明示的に削除する必要があります。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;
}
新しいオブジェクトを使わずにオブジェクトを作成する方法はありますか? –
はい、絶対に、標準的な方法で作成してください。例えば。 'ObjectClass my_obj()'私はあなたがJavaから来たと仮定しています。オブジェクトを削除しないとメモリリークを引き起こす可能性があるため、 'new'は危険です。私に10分を与えれば、私はPCに着いたら答えを整理します。 – TomJ
私のチームには、「new」と「delete」を使用しないよう指示します。自動ストレージは常に優先されます。あなたが_動的にストレージを必要とするときは、正しい種類のスマートポインタを使用してください。すべてのルールには明らかに例外がありますが、責任を持ってルールを破る経験豊かな開発者と、経験豊かな開発者がルールを正しく破ることが必要です。 –
- 1. メソッド定義内に作成されたオブジェクトの寿命
- 2. pythonのメソッド変数とメソッドで作成されたオブジェクト
- 3. オブジェクトが作成されるたびにexcuteメソッド
- 4. Userオブジェクトが作成されるたびに、UserInfoオブジェクトも作成
- 5. レール.findから作成されたオブジェクトの差(:ID)と.where()メソッド
- 6. HashMapオブジェクト〜myMapはパブリックJavaメソッドで作成されました
- 7. 最後に作成されたオブジェクトID
- 8. for()ループ内で作成されたオブジェクトを呼び出す
- 9. WPF MainWindowクラス内で作成されたオブジェクトへのバインド
- 10. C#Genericsメソッドとxmlからメソッドで作成されたパラメータ化された型のオブジェクトを返す
- 11. メソッド呼び出し中に作成されたローカルJavaオブジェクトのライフサイクル
- 12. PHP:オブジェクト内に疑似結合メソッドを作成する
- 13. rubyでオブジェクト(クラス)で作成されたオブジェクト(クラス)を作成するには?
- 14. RSpecの作成されたオブジェクト
- 15. null値で作成されたActiveRecordオブジェクト
- 16. __constructで作成されたPHPオブジェクト
- 17. オブジェクトBのオブジェクトCのメソッドへのアクセスは、オブジェクトAによって作成されました
- 18. レルム内の既に作成されたオブジェクトを参照するには?
- 19. ループ内に作成された各EditTextオブジェクトにaddTextChangeListenerを追加します。
- 20. ループ内でalloc'edの場合に作成されるオブジェクト数
- 21. AS3 Tween動的に作成されたオブジェクトと他のオブジェクト
- 22. AndroidのJavaCVジレンマ、IplImageが作成されたときにメソッド 'draw'の内部にNoClassDefFoundErrorがスローされました
- 23. テスト中のメソッドで内部的に作成されているHttpGetオブジェクトを一致させよう
- 24. .selectメソッドで作成された配列内のオブジェクトを参照する方法は?
- 25. クラス内で作成されたオブジェクトはプライベートフィールドにアクセスできますが、別のクラスで作成されたオブジェクトはなぜですか?
- 26. AS3ダイナミックに作成されたムービークリップのメソッドにアクセスする
- 27. メソッドやサービスクラスから作成されたrailsオブジェクトは自動的に初期化されません
- 28. 作成する!メソッド内のコントローラの作成メソッド
- 29. 問題:注入されたメソッドからデコレータで作成されたオブジェクト/変数への参照方法
- 30. Java Arrayに既に作成されたオブジェクトを追加する
あなたは、C++やJavaについて質問されていますか? 1つを選択し、あなたの質問から他のタグを削除します。 C++オブジェクトとJavaオブジェクトは根本的に異なります。一方に適用される回答は他方には適用されません。タグをスパムしないでください。 –
両方の回答を得ることは役に立ちます。 –
http://stackoverflow.com/questions/5836309/stack-memory-vs-heap-memory –