获取智能指针的指针指针

5
我有一个智能指针用于一个对象,我需要将其传递给一个只接受指针指针的方法。
以下是一个例子,其中原始智能指针失去了所有权。
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函数。我担心这个函数可能是丢失所有权的原因。 我已经更新了我的代码示例以反映实际操作。

1
只要 some_function 不获取您传递给它的指针或其对象指向的指针的所有权,那么您所做的可能就没问题了。 - Captain Obvlious
8
"get" 不会转移所有权,而 "release" 会。 - user2249683
1
现在你有麻烦了,阅读 pcap_findalldevs 的文档,你甚至可以避免使用 unique_ptr(如果该库管理内存)。 - user2249683
1
传递指向某个指针的地址给 pcap_findalldevs 是没有意义的。该函数将会覆盖该指针。 - n. m.
1
为什么要问这个问题?你从libpcap接收一个指针。它是一个输出参数。在调用之前,它不指向任何东西。调用之后,它指向一个链接列表。 - n. m.
显示剩余6条评论
3个回答

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();

3

2

您不需要这些操作。以下是正确的调用顺序:

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

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

请注意,ip实际上指向使用纯粹的原始指针实现的链接列表,您无法更改。使用智能指针来指向列表的头部的效用最多是有问题的。可能会有意义将信息复制到适当的C++容器中,并在调用之后处理链接列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接