次の質問に対して、あなたはどのような答えを受け入れますか
「コンストラクタおよびデストラクタから例外をスローするプロセスおよび/または落とし穴を説明する」(C++/C#/java)
これらの言語のいずれかで数年の経験があると主張する候補者にとって、これについてどの程度の知識が不可欠であると考えますか (彼がこれを逃した場合、あなたはほぼ確実に彼を望まないでしょう)。
次の質問に対して、あなたはどのような答えを受け入れますか
「コンストラクタおよびデストラクタから例外をスローするプロセスおよび/または落とし穴を説明する」(C++/C#/java)
これらの言語のいずれかで数年の経験があると主張する候補者にとって、これについてどの程度の知識が不可欠であると考えますか (彼がこれを逃した場合、あなたはほぼ確実に彼を望まないでしょう)。
C++ の経験が 2 年あるが、コンストラクター / デストラクタと例外の内外を理解していないという人がいたとしても、私がその人を雇うことを妨げることはありません。これは、簡単に習得でき、いくつかの簡単なルールで構成されるタイプの知識です。
私は確かに彼らにその知識を持ってもらいたいと思っていますが、それを持っていないからといって、彼らが悪いプログラマーや怠惰なプログラマーになるわけではありません. 私は、昔ながらの COM と HRESULT の世界で大部分の時間を費やした優秀な C++ プログラマーと仕事をしてきました。これにより、C++ が多用されますが、実質的に C++ の例外が排除されます。彼らがそれを学ぶ必要も理由もありません。コード ベースに例外を導入してから、コンストラクター/デストラクターの問題について全員が理解を深めるのに約 15 分かかりました。
C++ の特定の部分の内外を知っているかどうかを確認するよりも、問題解決能力をテストするためにインタビューを使用したいと思います。それを教えるのはとても簡単ですが、問題解決を教えるのはとても難しいです。
彼は、C ++では、完全に構築されたオブジェクトに対してのみデストラクタが呼び出されることを知っている必要があります。そのため、C++では次のクラスがリークします。
class Leaky {
public:
Leaky() { a = new char[100]; b = new char[100]; }
~Leaky() { delete a; delete b; }
private:
char* a;
char* b;
};
b = new char [100]の実行中に例外がスローされた場合 、Leaky ::〜Leaky()は呼び出されず、メモリリークが発生します。
これはどうですか(私はC ++を参照しています):オブジェクトがコンストラクター内でスローされた場合、オブジェクトは未定義の状態のままになる可能性があります。デストラクタは実行されません。これにより、メモリと処理のリークが発生し、デッドロックが発生する可能性があります。
また、C++ では、例外がスタックをアンワインドしているときに別の例外がデストラクタからスローされた場合、プログラムは終了します (正確には、terminate_handler を呼び出します)。
C# の try-catch-finally ブロックにコンストラクター コードを入れることはできませんか? このようにして、何か問題が発生した場合、finally セクションのコードがリソースを解放します。
これは一種のエッジの質問です。たとえば、有能な開発者は、おそらくどこかでそれが悪い考えであると判断し、それらを回避するでしょう。率直に言って、私がこれに対して行った最善のことは、オブジェクトを部分的に構築された状態のままにする可能性があるため、一般的にはそれを避けるのが最善です。」良い習慣とその理由。