获取智能指针的指针指针

时间:2016-02-04 18:54:17

标签: c++ pointers smart-pointers unique-ptr

我有一个对象的智能指针,我需要传递给一个只接受指针指针的方法。

以下是一个示例,其中原始智能指针失去了所有权。

int main(int argc, char* argv[])
{
    std::unique_pointer<pcap_if_t> object;

    auto object_pointer = object.get();
    pcap_findalldevs(&object_pointer, ...); // The unique_ptr loses ownership after being passed to the function
}

如果没有原始智能指针丢失指针所有权,我将如何实现这一目标?

修改
我正在调用的函数是libpcap中的 pcap_findalldevs 。我担心这个功能可能是失去所有权的原因 我已经更新了我的代码示例,以反映我实际做的事情。

3 个答案:

答案 0 :(得分:6)

将指针指向指针的函数通常会这样做,因为它可能会改变它,而pcap_findalldevs确实是这样做的。并且应该通过调用pcap_freealldevs释放该指针。

所以你最好的选择是unique_ptr自定义删除器从原始指针获取所有权:

struct pcap_deleter
{
    void operator()(pcap_if_t* ptr) 
    {
        pcap_freealldevs(ptr);
    }
};

//...
using pcap_ptr = std::unique_ptr<pcap_if_t, pcap_deleter> 
pcap_ptr get_devs() {
    pcap_if_t* object_pointer;
    pcap_findalldevs(&object_pointer, ...); 
    return pcap_ptr(object_pointer);
}

//...

auto object = get_devs();

答案 1 :(得分:3)

  

以下是一个示例,其中原始智能指针失去了所有权。

不。在调用get()

后,unique_ptr会保留所有权 调用release()

后,

unique_ptr将失去所有权

参考:http://en.cppreference.com/w/cpp/memory/unique_ptr

答案 2 :(得分:2)

你不需要这些。这是正确的调用序列:

 pcap_if_t ip = nullptr;
 res = pcap_findalldevs(&ip, errbuf);
 // now ip (hopefully) points to something

在通话之前,没有地方指向任何的智能指针。现在调用之后,您可以将ip分配给某种智能指针。别忘了自定义删除器,你需要它。

请注意,ip实际上指的是使用简单原始哑的诚实指针实现的链接列表,您无法更改。智能指针到列表头部的效用充其量是有问题的。将信息复制到合适的C ++容器并在调用后立即处理链接列表可能是有意义的。