
項目 18:独占するリソースの管理には std::unique_ptr を用いる
|
121
std::unique_ptr<Investment, decltype(delInvmt)> // as
pInv(nullptr, delInvmt); // before
先の例と同様
if ( … ) // as before
{
pInv.reset(new Stock(std::forward<Ts>(params)...));
}
else if ( … ) // as before
{
pInv.reset(new Bond(std::forward<Ts>(params)...));
}
else if ( … ) // as before
{
pInv.reset(new RealEstate(std::forward<Ts>(params)...));
}
return pInv; // as before
}
前述したように、ディフォルトのデリータを使用する場合は(delete)、std::unique_ptr のサ
イズが raw ポインタと同じであると想定しても安全です。しかし、カスタムデリータを用いる場合
では、この想定は崩れます。デリータとして関数ポインタを与えると、std::unique_ptr のサイズ
が 1 ないし 2 ワード増加するのが一般的です。また、関数オブジェクトを与えると、このサイズの
増加は、関数オブジェクトが保持する状態のサイズに応じ変化します。関数オブジェクトが状態を
持たなければサイズは変化しません(キャプチャを伴わないラムダ式) ...