我有这个想法:
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_ptr也default_delete默认使用.
它的工作方式与Clang 5.0.0一样.
那么,它是否受到支持?
如果STL实现具有不同的内部命名空间怎么办?它不会找到我的声明呢?但那应该是关于声明的错误.
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.
Run Code Online (Sandbox Code Playgroud)~shared_ptr();效果:
如果 *this 为空或与另一个 shared_ptr 实例共享所有权 (use_count() > 1),则没有副作用。
否则,如果 *this 拥有一个对象 p 和一个删除器 d,则调用 d(p)。
否则,*this 拥有一个指针 p,并调用删除 p。
| 归档时间: |
|
| 查看次数: |
2827 次 |
| 最近记录: |