内部でいくつかのメモリ割り当てを行うデストラクタ内で関数を呼び出すことをお勧めします。これにより、アクセス違反やその他の問題が発生しているため、
~Example(){
Stop();
}
ここで、この関数 Stop() はさまざまなことを行い、他のさまざまな関数を呼び出しますか? それは良い習慣ですか?誰でもこれを手伝ってもらえますか?
内部でいくつかのメモリ割り当てを行うデストラクタ内で関数を呼び出すことをお勧めします。これにより、アクセス違反やその他の問題が発生しているため、
~Example(){
Stop();
}
ここで、この関数 Stop() はさまざまなことを行い、他のさまざまな関数を呼び出しますか? それは良い習慣ですか?誰でもこれを手伝ってもらえますか?
デストラクタ内で関数を呼び出すことに問題はありません。考慮すべき唯一の重要な点は、デストラクタから発生するキャッチされない例外があってはならないということです。
したがって、デストラクタ内で呼び出された関数からスローされたすべての例外をデストラクタ内でキャッチする限り、安全です。
デストラクタが実行する必要があることは、クラスの状態と設計から直接導かれます。そのため、選択肢はスリムです。インライン化するか、関数を呼び出すことができます。特に他のメンバー関数もそれを使用する可能性がある場合、関数を呼び出さない理由はわかりません。(つまり、関数を持つスマートポインターの実装を参照してくださいreset()
...)
仕事が複雑なら、やらないほうがいいとほのめかしていますね。うーん。それとも、単に dtor でそれを行うのではなく、その義務をプログラマーに任せているという考えですか? Cに戻るのと同じように?C++ の最も魅力的な機能は、RAII を有効にする dtor を備えていることです。
dtor で注意すべき特別なことは、例外を飲み込むことです。運が良ければ、それらは自然に発生しません。機会があれば、大部分のタスクを実行する公的な機能を用意することをお勧めします。ここから投げることは公正なゲームです。(CFile
つまり、クラスがまだ開いている場合は、dtor でファイルを閉じます。出力ファイルに使用する場合は、手動でファイルを閉じ、ディスクがいっぱいになった最後のバッファーをフラッシュできないなどの可能性のあるエラーに対処する必要があります。それをすべて行い、 dtorは重労働から解放されます。
解放/解放プロセスの一部である限り、デストラクタからメソッドを呼び出すことは問題ありません。逆方向 (リソース/メモリの取得) で操作を実行することはお勧めできません。
デストラクタは、 astd::bad_alloc
がスローされたとき、つまりメモリ割り当てが失敗したときに呼び出されます。その場合、デストラクタ (またはデストラクタによって呼び出される関数) でのメモリの割り当てもおそらく失敗し、例外がスローされます。
デストラクタから例外をスローすることは、本当に悪い考えです。現在、デストラクタはその秒をキャッチできますが、std::bad_alloc
それを適切に処理するために必要な手段があるとは思えません。
他の方もおっしゃっていますが、大丈夫ですが危険です。クラスの一部はすでに破棄されている可能性があるため、クラス内のすべてを使用できない可能性があることに注意してください。さらに、メソッド内で例外を処理してみてください。