Both unique_ptr
and shared_ptr
accept a custom deleter to call on the object they own. But in the case of unique_ptr
, the deleter is passed as a template parameter of the class, whereas the type of shared_ptr
's custom deleter is to be specified as a template parameter of the constructor.
template <class T, class D = default_delete<T>>
class unique_ptr
{
unique_ptr(T*, D&); //simplified
...
};
and
template<class T>
class shared_ptr
{
template<typename D>
shared_ptr(T*, D); //simplified
...
};
I can't see why such difference. What requires that?
If you provide the deleter as template argument (as in unique_ptr
) it is part of the type and you don't need to store anything additional in the objects of this type.
If deleter is passed as constructor's argument (as in shared_ptr
) you need to store it in the object. This is the cost of additional flexibility, since you can use different deleters for the objects of the same type.
I guess this is the reason: unique_ptr
is supposed to be very lightweight object with zero overhead. Storing deleters with each unique_ptr
could double their size. Because of that people would use good old raw pointers instead, which would be wrong.
On the other hand, shared_ptr
is not that lightweight, since it needs to store reference count, so storing a custom deleter too looks like good trade off.