我想说我想使用带有unique_ptr的自定义删除器:
void custom_deleter(int* obj)
{
delete obj;
}
为什么我要写这个:
std::unique_ptr<int, void(*)(int*)> x(new int, custom_deleter);
而不是:
std::unique_ptr<int> x(new int, custom_deleter); //does not compile
可以推断出删除器的类型吗?
答案 0 :(得分:6)
对于unique_ptr
,删除器是类型的一部分:
template <
class T,
class Deleter = std::default_delete<T>
> class unique_ptr;
因此,当您构建对象时,需要指定其类型。您正在撰写的专栏:
std::unique_ptr<int> x(new int, custom_deleter);
相当于:
std::unique_ptr<int, std::default_delete<int> > x(new int, custom_deleter);
您无法从std::default_delete<int>
构建custom_deleter
。
推断删除类型的唯一方法是在该部分使用模板推理:
template <typename T, typename Deleter>
std::unique_ptr<T, Deleter> make_unique_ptr(T* ptr, Deleter deleter) {
return std::unique_ptr<T, Deleter>(ptr, deleter);
}
答案 1 :(得分:3)
它无法推断删除器的类型,因为默认情况下unique_ptr
没有专门用于删除器的状态:默认删除器是无状态的。
在你的情况下,删除者需要一个指针的状态,所以它不适合&#39;在std::unique_ptr
的状态(这只是指向T
的指针)。
这使得unique_ptr
成为拥有指针的轻量级,几乎无成本的替代品。
可以完成Deductin,但必须更改结果unique_ptr
的类型。
相比之下,shared_ptr
总是具有删除器的状态容量,两个不同的原子计数器和一个指向值的指针。它的重量更重,而且不是指针的免费替代品。