我正在尝试使用unique_ptr自定义删除器映射第三方API。问题是API就是这样:
x *x_alloc_x(void);
void x_free_x(x **p);
API希望我提供指向它的指针,以便将其设置为NULL。我一直在编写我的删除函数作为一个引用指针,我将其转换为指针指针与"&"操作
struct XDeleter {
void operator(x *&p) { x_free_x(&p); }
};
这与GCC 4.6一起使用,但标准实际上是否允许这样做?如果没有,是否有符合标准的方法将此API映射到删除器?
答案 0 :(得分:2)
代码格式不正确。 n3797 [unique.ptr.single.dtor] / 1在unique_ptr
的析构函数中需要:
需要:表达式
get_deleter()(get())
应该很好地形成[...]
[unique.ptr.single]指定:
pointer get() const noexcept;
也就是说,get()
是一个prvalue。
此外,[unique.ptr.single] / 1
客户端提供的模板参数
D
[删除者类型] 应该是函数对象类型,函数的左值引用或函数对象类型的左值引用 为此,给定类型d
的值D
和类型ptr
的值unique_ptr<T, D>::pointer
,表达式d(ptr)
有效,并且具有针对该删除器处理指针的效果。
值是一个prvalue。
Mooing Duck的评论中提供了解决方案:
struct XDeleter {
void operator(x *p)
{ x_free_x(&p); }
};
然而,unique_ptr
的析构函数不需要将nullptr
分配给存储的指针。