为`std :: shared_ptr`专门化`std :: default_delete`

时间:2013-11-29 10:34:35

标签: c++ shared-ptr

我有这样的想法:

namespace std {
    template<>
    class default_delete<IplImage> {
    public:
        void operator()(IplImage *ptr) const {
            cvReleaseImage(&ptr);
        }
    };
};

typedef std::shared_ptr<IplImage> IplImageObj;

我并没有真正找到很多信息,我是否支持我专注default_delete以及默认情况下shared_ptr是否也使用default_delete

它与Clang 5.0.0一样。

那么,是否支持?

如果STL实现具有不同的内部命名空间怎么办?它不会找到我的声明呢?但那时宣言应该是错误的。

1 个答案:

答案 0 :(得分:3)

应该在std命名空间中定义

default_delete,并且可以从std命名空间中专门化实体。

namespace std {
template<class T> struct default_delete;
template<class T> struct default_delete<T[]>;

但是,您的专业化违反了std::default_delete的一些要求,因此是UB。关于这件事的行情是here(感谢R. Martinho Fernandes)。

但是,shared_ptr未指定使用default_delete

~shared_ptr();
     

效果:

     
      
  • 如果*为空或与另一个shared_ptr实例共享所有权(use_count()&gt; 1),则没有副作用。

  •   
  • 否则,如果*拥有对象p和删除者d,则调用d(p)。

  •   
  • 否则,*它拥有一个指针p ,并且会调用delete p。

  •