読者です 読者をやめる 読者になる 読者になる

make_sharedの問題点

C++

BoostML - make_shared and custom deleter


BoostやC++0xにはmake_shared/allocate_sharedという、shared_ptrを生成するためのヘルパ関数があります。

template<class T, class... Args>
shared_ptr<T> make_shared(Args&&... args);

template<class T, class A, class... Args>
shared_ptr<T> allocate_shared(const A& a, Args&&... args);
shared_ptr<person> p = make_shared<person>(24, "Akira");

これはとても便利なのですが(newすら書かせないスマートポインタ!)
Custom Deleterを指定できないという問題があります。

// shared_ptrのコンストラクタならCustom Deleterを指定できるが
shared_ptr<person> p(new person(24, "Akira"), [](person* x) { x->disp(); delete x; });

// make_sharedだと指定できない
shared_ptr<person> p = make_shared(24, "Akira", ??);

今のところ、Custom Deleterが必要な場合には、これらのヘルパ関数は使用できないようです。
(Custom Deleterを管理するアロケータを作ればできるけど)