unique_ptr删除指针指针

时间:2014-05-02 22:44:43

标签: c++ c++-standard-library

我正在尝试使用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映射到删除器?

1 个答案:

答案 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分配给存储的指针。