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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With