メモの日々


2011年07月13日(水) [長年日記]

[c++] deleteしないshared_ptr

deleteしないshared_ptrを使いたいと思ったのだけれど、そんなのが欲しい状況というのはおかしいのかなあと悩んだ。

boost::shared_ptrのマニュアルの「Smart Pointer Programming Techniques」という章に

という項目があって、そこにshared_ptrへ何もしないdeleterを設定する方法が載っていたので、こういうのもアリなんだなと安心した。

[c++] boost::shared_ptr#reset(Y* p)を呼んだときのdeleterの扱い

boost::shared_ptrのドキュメントを読んで、deleterを指定して作成したshared_ptrに対してdeleterを指定しないreset(Y* p)を呼んだらdeleterはリセット(デフォルトのdeleterがセット)されそうに思ったけど、はっきりしなかったので試した。

#include <iostream>
#include <boost/shared_ptr.hpp>

class A {
private:
    int i;

public:
    A(int i) : i(i) {}
    ~A() { std::cout << "Destructing A(" << i << ")" << std::endl; }
};

struct NullDeleter {
    void operator()(const A*) const {}
};

int main() {
    boost::shared_ptr<A> a(new A(1), NullDeleter());
    a.reset(new A(2));
}

結果、

Destructing A(2)

とだけ出力されたので、A(1)はdeleteされないけどA(2)はdeleteされており、deleterはリセットされていた。