获取智能指针的指针指针

Get a pointer pointer for a smart pointer

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

举个例子,原来的智能指针失去了所有权。

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

Here's an example, where the original smart pointer loses the ownership.

没有。 unique_ptr 在调用 get()

后保留所有权

unique_ptr 将在调用 release()

后失去所有权

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

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

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

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

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

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