スマートポインタ

今日はスマートポインタについて学んでみたいと思います。

newで確保した変数はdeleteで解放してあげないといけません。とはいえプログラマーは人間なのでdeleteを良く忘れてしまいます。

ある関数の戻り値にnewした変数を返す場合があると、その関数がnewで確保したということを知っていないとdeleteを呼ぶことすら出来ないのでかなり怖いですね。

そこでスマートポインタというものを使います。

仕組みは単純です。前に勉強したauto_ptrと似ています。

auto_ptrの場合、そのポインタの所有権を代入先の変数に任せるという実装でした。この場合、所有権を失った元の変数はもう使えなくなってしまうので不便です。

int main () {
    std::auto_ptr<CSample> p1( new CSample(100) );
    cout << p1->getNum() << endl;
    
    // p1をp2に代入すると、p1のCSampleがp2へ移動する
    std::auto_ptr<CSample> p2 = p1;
    
    // よってp1はもう使えない。
    cout << p1->getNum() << endl;
    
    return 0;
}

スマートポインタを使えば、この問題を解決できます。

int main () {
    // スマートポインタを使う
    std::tr1::shared_ptr<CSample> p1( new CSample(100) );
    cout << p1->getNum() << endl;
    
    std::tr1::shared_ptr<CSample> p2 = p1;
    
    cout << p1->getNum() << endl;
    
    return 0;
}

問題なく動きます。

さてstd::tr1という見慣れない名前空間が出てきましたね。

これは次期C++で標準のライブラリとして仲間入りする前段階の名前空間です。このshared_ptrも次期C++ではstdの直下になるようです。

ちなみにこのshared_ptrはもともとBoostというC++のライブラリに存在していた物らしいです。Boostについてもいずれ色々と勉強していきたいとは思っています。