インターフェイスの一部であるため、生のポインターをスマート ポインターに変更できないケースがあります (それを使用するコードを壊したくありません)。
struct Foo
{
Foo();
~Foo();
int * m_pStuff; // public!
};
私は自分のセンターで多くのことをしたくありません。次のようなものです:
m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
m_pStuff[0] = 0;
そして、デストラクタでそれを削除します。
ここで、try/catch で囲む価値があるかどうか疑問に思います。
Foo::Foo()
: m_pStuff(0)
{
try
{
m_pStuff = new int[dynamically_obtained_size_which_is_greater_than_0];
m_pStuff[0] = 0;
}
catch(...)
{
delete m_pStuff;
throw;
}
}
私が見ることができるポイント:
- より複雑なコード
- そこで例外が発生することを実際には期待していません(割り当て時にスペースが不足しない限り)
- コードが変更されることを本当に期待していない
私が見ることができるポイント:
- 潜在的な将来のコーダーに、例外をスローするものに注意し、それを既に配置されている try ブロックに入れる必要があることを示します
- 例外が発生した場合、メモリ解放が処理されます
私はかなり未定です: これを try/catch で囲む必要がありますか? なんで?その上でご意見をお聞きしたいです。
また、割り当て時にメモリ不足が原因で発生する以外の例外の可能性はありますか? その場合、すでに割り当てられているメモリは自動的に再利用されますよね?
ありがとう!