获取智能指针的指针指针



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

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

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。恐怕该功能可能是失去所有权的原因。
我已经更新了我的代码示例以反映我实际所做的。

接受指针到指针的函数通常会这样做,因为它可能会改变它,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();

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

不。unique_ptr在调用get()后保留所有权

unique_ptr将在致电release()后失去所有权

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

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

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

在通话之前,没有指向任何内容的智能指针。现在,在呼叫之后,您可以将ip分配给某种智能指针。不要忘记自定义删除器,您将需要它。

请注意,ip实际上指向一个链表,该链表是用普通的原始愚蠢的诚实指针实现的,您无法更改该指针。指向列表顶部的智能指针的效用充其量是值得怀疑的。将信息复制到合适的C++容器并在调用后立即处理链表可能是有意义的。

相关内容

  • 没有找到相关文章

最新更新