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

Alb*_*ert 6 c++ shared-ptr

我有这个想法:

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

typedef std::shared_ptr<IplImage> IplImageObj;
Run Code Online (Sandbox Code Playgroud)

我真的没有找到太多的信息是否支持我专门化default_delete,是否shared_ptrdefault_delete默认使用.

它的工作方式与Clang 5.0.0一样.

那么,它是否受到支持?

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

For*_*veR 4

default_delete应该在 std 命名空间中定义,并且可以专门化 std 命名空间中的实体。

namespace std {
template<class T> struct default_delete;
template<class T> struct default_delete<T[]>;
Run Code Online (Sandbox Code Playgroud)

然而,你的专业违反了一些要求std::default_delete,因此是 UB。关于这件事的引述在这里(感谢 R. Martinho Fernandes)。

但是,shared_ptr没有指定使用default_delete.

~shared_ptr();
Run Code Online (Sandbox Code Playgroud)

效果:

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

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

  • 否则,*this 拥有一个指针 p,并调用删除 p。