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はリセットされていた。