2016-05-25 5 views
0

私は全く新しいC++です。私は以下について質問したいと思います。動的に割り当てられたメンバー変数。ポイントは何ですか?

メンバ変数がコンストラクタで動的に割り当てられている場合。それは常にデストラクタで削除する必要がありますか?もしそうなら、変数の寿命はどのくらい長く伸びていますか?もしそうでなければ、メモリーリークはどのように扱われるべきですか?

この問題を明示的に解決するための情報源が見つかりませんでした。

+3

動的に割り当てられたデータメンバーの場合は、コピーと移動を担当する必要があります。それとは別に、デストラクタで削除することも可能です。代わりに、例えばスマートなポインタを優先的に使用する。 'std :: unique_ptr'(できるだけ標準ライブラリコンテナを使用する方が良い)。 –

+0

必要なものはスマートポインタです。 C++ライブラリには、あらかじめ定義されたスマートポインタがいくつかあります。どちらかを使用するか、自分で設計してください。 –

+0

スマートポインタを使用する場合、移動コンストラクタを使用する必要がありますか? –

答えて

3

理由動的

  • アレイのサイズは、非一定であってもよいしている部材を割り当てる
  • 部材は、スタック上の十分なメモリがないように、非常に大きくなる可能性が
  • メンバは多態性であり、MSaltersによってコメントされています。

しかし、Alfはすでにコメントに指摘しているように、スマートポインタを使用することをお勧めします。これには、デストラクタ内のそのメンバーを明示的にdeleteする必要がないという利点があり、shared_ptrの場合、必要に応じてライフタイムを伸ばすことができ、スマートポインタが破壊を処理します。

+0

@ D.Badawiが書いたように、スマートポインタが好まれます。 [here](http://www.cplusplus.com/reference/memory/)に関する追加情報があります。残念ながら、それらのほとんどはC++ 11から入手できます。 –

+1

第3の理由:メンバは多型である。 'Derived1'か' Derived2'のどちらかであるので、その型を 'std :: unique_ptr member;'として定義します。 – MSalters

2

デストラクタでは常に削除する必要がありますか?

これ以上使用されないことが確かな場合は、他の機能によって作業が完了するとすぐにメモリを解放することができます。しかし、メモリリークを避けるためにも、破壊ルーチンからこの破壊ルーチンを呼び出さなければなりません。理想的には、メモリにReAllocateの別の機能を提供する必要があります。

要するに、それはあなたのクラスと何を実装しているかによって異なります。

1

多くのオブジェクトを共有している場合shared_ptrを使用し、私はいくつかのポストモダン的なアプローチを取るだけで作成・オブジェクトは、そのリソースのinchargeある場合

使用unique_ptrを「あなたはもうそれを心配する必要はありません」と言ってみましょうそのリソース。 STLコンテナは他のすべての用途に使用してください。

newdeleteを使用するのは、極端に低レベルのものを作成しているか、最初からコンテナを実装している場合のみです。他のすべてのケースでは、(mallocnewを介した)動的メモリ割り当てを廃止予定と見なします。

関連する問題