スマートポインタの必要性

あるオブジェクトが、他のオブジェクトのポインタを保持するという関係は良くある形だ。しかし、こういう形には、けっこう厄介な問題が潜んでいることが多い。以下のクラスを考えてみる。

class A {
public:
 A(): b1(new B), b2(new B) {
 }
 ~A() {
  delete b1;
  delete b2;
 }
private:
 B * const b1;
 B * const b2;
}

一見すると何の問題もないが、b2(new B)で例外が発生(例えばメモリ不足によって)すると、b1のメモリを回収することができない。

このように、ポインタを保持するクラスを例外安全にするのは難しい。

結論としては、スマートポインタを使用するしかない。例えば、autoポインタを使うと以下のように書ける。

class A {
public:
 A(): b1(new B), b2(new B) {
 }
 ~A() {
 }
private:
 const std::auto_ptr< B > b1;
 const std::auto_ptr< B > b2;
}