Effective C++(Scott Meyers)を見ている間に、データメンバーをあるオブジェクトから別のオブジェクトにコピーするときに例外を処理する方法を示すために、 。コピー代入演算子の例外処理(C++)
class Bitmap { ... };
class Widget {
...
private:
Bitmap *pb; // ptr to a heap-allocated object
};
Widget& Widget::operator=(const Widget& rhs)
{
Bitmap *pOrig = pb; // remember original pb
pb = new Bitmap(*rhs.pb); // make pb point to a copy of *pb
delete pOrig; // delete the original pb
return *this;
}
"新しいビットマップ"が例外をスローすると、pbは変更されません。ただし、 pOrigを削除すると、pbが指すメモリが解放されます。これは危険ではないですか?それはどのように「新しいビットマップ」は、例外を生成するときので悪いです(彼は主張して)次のコード
Widget& Widget::operator=(const Widget& rhs)
{
if (this == &rhs) return *this; // identity test: if a self-assignment,
// do nothing
delete pb;
pb = new Bitmap(*rhs.pb);
return *this;
}
(ビットマップのコピーコンストラクタは1を投げますので、そこに割り当てるための十分なメモリがあるかのどちらかので)よりも良くありウィジェットは、削除されたビットマップへのポインタを保持することになります
私は本の正誤表をチェックしましたが、この例は言及されていません。私は明白な何かを欠いていますかまた、誰かがこの例外を処理するより良い方法を提案できますか?
ありがとうございました。 – Sam