私は生のポインタを使わないときにクラス内にデストラクタを書く必要があるのですか?ちょうどスマートポインタを強化する。スマートポインタとデストラクタ
答えて
デストラクタの提供を常に検討する必要があります。クラスを使用しているリソースを解放するには、これを使用します。多くの場合、私のsmart_ptrクラスのデストラクタは空ではありませんが、必ずしもそうではありません。ファイルストリーム、データベース接続などはすべて適切なクリーンアップが必要です。
これらのものはすべて、 'smart_ptr'のようなRAIIクラスでラップすることでクリーンアップすることができます。 C++ 11では、クラスのデストラクタはまれであるはずです。 –
@Mooing冗談はありません。スマートポインタ/ RAIIは私のコードを大幅に減らし、デストラクタは一般に空です。彼らは慣れていくのに時間がかかりますが、確かに学ぶ価値があります。 – Aura
ブーストスマートポインタ自体は、デストラクタの必要性とは関係ありません。彼らが行うのは、効果的に管理している割り当てられたメモリ上で削除を呼び出す必要がなくなることだけです。つまり、スマートポインタを使用する前に、デストラクタにあったものが、動的に割り当てられたクラスメンバのメモリを解放して削除する呼び出しであった場合、これらのすべての通常のポインタをスマートポインタに切り替えました。おそらく、空のデストラクタに切り替えると、スコープ外に出たときに自分自身でクリーンアップするようになります。
しかし、何らかの理由でクリーンアップ(ファイルクリーンアップ、ソケット、その他のリソースなど)が必要なクラスがある場合は、そのためにデストラクタを用意する必要があります。
それが役立つかどうか教えてください。
これらのものはすべて、 'smart_ptr'のようにRAIIクラスでラップすることでクリーンアップすることができます。 C++ 11では、クラスのデストラクタはまれであるはずです。 –
各リソースタイプには、そのリソースを管理するためのRAIIクラスが必要です。ディープ・コピー・セマンティクス(かなり簡単)を備えたスマート・ポインタもあれば、それは99.9%のリソースを管理するために必要なすべてです。私はなぜunique_ptr
が深いコピーもブーストスマートポインタもしないのか分からないが、もしあなたがそれらの2つのことを持っていれば、コピーコンストラクタ、移動コンストラクタ、代入演算子、移動代入演算子、デストラクタを書く必要はない。他のコンストラクタ(デフォルトのコンストラクタを含む)を提供する必要がある場合とそうでない場合がありますが、それは間違いをする場所が5つ少なくなります。
#include <memory>
template<class Type, class Del = std::default_delete<Type> >
class deep_ptr : public std::unique_ptr<Type, Del> {
public:
typedef std::unique_ptr<Type, Del> base;
typedef typename base::element_type element_type;
typedef typename base::deleter_type deleter_type;
typedef typename base::pointer pointer;
deep_ptr() : base() {}
//deep_ptr(std::nullptr_t p) : base(p) {} //GCC no has nullptr_t?
explicit deep_ptr(pointer p) : base() {}
deep_ptr(pointer p, const typename std::remove_reference<Del>::type &d) : base(p, d) {} //I faked this, it isn't quite right
deep_ptr(pointer p, typename std::remove_reference<Del>::type&& d): base(p, d) {}
deep_ptr(const deep_ptr& rhs) : base(new Type(*rhs)) {}
template<class Type2, class Del2>
deep_ptr(const deep_ptr<Type2, Del2>& rhs) : base(new Type(*rhs)) {}
deep_ptr(deep_ptr&& rhs) : base(std::move(rhs)) {}
template<class Type2, class Del2>
deep_ptr(deep_ptr<Type2, Del2>&& rhs) : base(std::move(rhs)) {}
deep_ptr& operator=(const deep_ptr& rhs) {base::reset(new Type(*rhs)); return *this;}
template<class Type2, class Del2>
deep_ptr& operator=(const deep_ptr<Type2, Del2>& rhs) {base::reset(new Type(*rhs)); return *this;}
deep_ptr& operator=(deep_ptr&& rhs) {base::reset(rhs.release()); return *this;}
template<class Type2, class Del2>
deep_ptr& operator=(deep_ptr<Type2, Del2>&& rhs) {base::reset(rhs.release()); return *this;}
void swap(deep_ptr& rhs) {base::swap(rhs.ptr);}
friend void swap(deep_ptr& lhs, deep_ptr& rhs) {lhs.swap(rhs.ptr);}
};
このクラス(または同様のもの)では、あまり必要ありません。 http://ideone.com/Kdhj8
- 1. スマートポインタと配列
- 2. C++ Visitorパターンとスマートポインタ
- 3. スマートポインタと派生クラス
- 4. スマートポインタとQThread問題
- 5. スマートポインタ
- 6. スマートポインタ
- 7. スマートポインタ
- 8. 仮想デストラクタと通常のデストラクタ対
- 9. ブーストshared_from_thisとデストラクタ
- 10. ガベージコレクタとデストラクタ
- 11. スマートポインタと例外処理
- 12. スマートポインタと自動反復
- 13. スマートポインタとJavaでのRef Counting
- 14. スマートポインタとコンストラクタの例外
- 15. 継承とスマートポインタ(std :: shared_ptr)
- 16. スマートポインタと自動参照カウント
- 17. C++の値とデストラクタ?
- 18. フォワード宣言とデストラクタ
- 19. スマートポインタの質問
- 20. バイナリツリーのスマートポインタ
- 21. Qtのスマートポインタ
- 22. C++のスマートポインタ
- 23. Valgrindのは、スマートポインタ
- 24. はスマートポインタで
- 25. スマートポインタ相当
- 26. スマートポインタ対参照
- 27. デストラクタ
- 28. クラスがスマートポインタだけで構成されていてもデストラクタをdelclare/defineする必要がありますか?
- 29. "= default"デストラクタと空のデストラクタの違いは何ですか?
- 30. C++ - スマートポインタとカスタムメモリ割り当てジレンマ
で実証されているように
たぶん@simchonaは私にはない何かを知っているが、スマートポインタは、クリーンアップの必要性を軽減していない、彼らはちょうどそれが起こるか(とき)に変更。 –
私はこの質問を読んでいます。スマートなポインタを増やしてください。ほとんどの場合、デストラクタを書く必要はありませんか?あれは正しいですか? – gymbrall
@Yeah、あなたがdeep_pointer(またはそれが呼び出されているもの)があれば、代入/移動/デストラクタ/コンストラクタは必要ありません。 (コンストラクタは時には便利なことがありますが) –