C++ 专门为“std::shared”指定“std::default\u delete”`

C++ 专门为“std::shared”指定“std::default\u delete”`,c++,shared-ptr,C++,Shared Ptr,我有这样做的想法: namespace std { template<> class default_delete<IplImage> { public: void operator()(IplImage *ptr) const { cvReleaseImage(&ptr); } }; }; typedef std::shared_ptr<IplImage> Ip

我有这样做的想法:

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

typedef std::shared_ptr<IplImage> IplImageObj;
名称空间std{
模板
类默认值\u删除{
公众:
void运算符()(IplImage*ptr)常量{
cvReleaseImage(&ptr);
}
};
};
typedef std::shared_ptr IplImageObj;
我真的没有找到太多信息,是否支持我专门从事
default\u delete
,以及
shared\u ptr
是否默认使用
default\u delete

它的工作原理与Clang5.0.0的预期一致

那么,它是否得到支持


如果STL实现具有不同的内部名称空间怎么办?那就找不到我的申报单了?但是它应该在声明中出错。

默认值\u delete应该在std名称空间中定义,并且可以从std名称空间专门化实体

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

  • 如果*为空或与另一个共享的\u ptr实例共享所有权(使用\u count()>1),则没有副作用

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

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


只有在保留现有语义的情况下才允许专门化
default\u delete
。(是的,这意味着这是允许的,但毫无意义)@R.MartinhoFernandes:为什么毫无意义?当未指定删除程序时,
std::unique_ptr
使用默认销毁策略。因此,这是全局覆盖
std::unique_ptr
使用的某些特定类型的默认销毁策略的另一种方法。我也认为同样的用法,但是代码> SyddypTr> /Cudio>,它也在CLAGS STL实现中,但是它似乎不是按照C++标准。另请参见:(“仅当声明取决于用户定义的类型且专门化满足原始模板的标准库要求且未明确禁止时,程序才可以将任何标准库模板的模板专门化添加到命名空间std。”)@R.MartinhoFernandes:这只是说它必须满足与标准库相同的要求,而不是它需要具有相同的语义。当然,真正的问题是
std::default\u delete
只适用于
std::unique\u ptr
,而不适用于
std::shared\u ptr
。@R.MartinhoFernandes:我认为chrisdd的观点是,它必须以预期的方式对删除者进行操作;保留现有语义意味着“表现得像一个删除者”,而不是“执行与您试图替换的被破坏的默认值相同的操作”。只要API匹配,它就会执行预期的操作(对相关类型执行适当的清理以避免泄漏),并且只定义了一个重载,这是允许的。没有要求两个不相关的程序必须就删除的含义达成一致。仍然没有帮助
std::shared_ptr
,但是对
std::unique_ptr
有用。啊,那么clangstl实现在这方面是错误的吗?因为如果我专门化
default\u delete
shared\u ptr
,没有自定义的删除程序,我会使用我专门化的
default\u delete
,因此不必调用
delete p
。啊,根据评论中的MartinhoFernandes,我不允许专门化它(以我的方式)。因此,如果
shared\u ptr
使用它与否其实并不重要。你应该添加一个链接来解释为什么我不能像我那样专门化
default\u delete
。@Albert:我不知道有什么东西禁止专门化
std::default\u delete
。我认为MartinhoFernandes正在以一种奇怪的严格方式阅读“专业化满足原始模板的标准库要求”;标准库要求基本上只是“匹配原型(
void operator()(T*ptr)const;
),执行一些逻辑删除功能”,这是您的代码所满足的(只是
std::shared_ptr
没有声明要使用它)。
~shared_ptr();