specialise `std::default_delete` for `std::shared_ptr`
c++, shared-ptr
Solution
`default_delete` should be defined in std namespace and it's ok to specialize entities from std namespace.
namespace std {
template<class T> struct default_delete;
template<class T> struct default_delete<T[]>;
However, your specialization violates some of the requirements of `std::default_delete` and thus is UB. Quotes about this thing are here (thanks to R. Martinho Fernandes).
However, `shared_ptr` is not specified to use `default_delete`.
~shared_ptr();
Effects:
If *this is empty or shares ownership with another shared_ptr instance (use_count() > 1), there are no side effects.
Otherwise, if *this owns an object p and a deleter d, d(p) is called.
Otherwise, *this owns a pointer p, and delete p is called.
Problem
I have the idea to do this: ``` namespace std { template<> class default_delete<IplImage> { public: void operator()(IplImage *ptr) const { cvReleaseImage(&ptr); } }; }; typedef std::shared_ptr<IplImage> IplImageObj; ``` I didn't really found much information whether it is supported that I specialise `default_delete` and whether `shared_ptr` also uses `default_delete` by default. It works like intended with Clang 5.0.0. So, is it supported? What if the STL implementation has a different internal namespace? It wouldn't find my declaration then? But it should error about the declaration then.