gpt4 book ai didi

c++ - 将 `std::default_delete` 专门化为 `std::shared_ptr`

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:50 25 4
gpt4 key购买 nike

我有这样的想法:

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 实现有不同的内部命名空间怎么办?那它不会找到我的声明吗?但它应该会在声明中出错。

最佳答案

default_delete 应该在 std 命名空间中定义,并且可以专门化 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();

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.

关于c++ - 将 `std::default_delete` 专门化为 `std::shared_ptr`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20283685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com