2016-02-04 151 views
4

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

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

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 
} 

如果没有原来的智能指针丢失指针所有权,我该怎么做到这一点?

编辑:
我打电话的功能是函数pcap_findalldevs在libpcap的。我担心这个功能可能是失去所有权的原因。
我已经更新了我的代码示例以反映我实际执行的操作。

+1

只要'some_function'没有取得你传递它的指针的所有权,或者它的对象指向你正在做的事情的指针可能就好了。 –

+0

使用'std :: move',你试过了吗? – dlmeetei

+0

@Deleisha你到底想要什么?另一个'std :: unique_ptr'? –

回答

6

函数,该函数指针的指针通常不会如此,因为它可能会改变它,pcap_findalldevs确实是那样。该指针应该在拨打pcap_freealldevs后发布。

所以最好的办法是用unique_ptr定制删除从原始指针aquiring所有权:

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

你不需要任何的这一点。这是正确的调用序列:

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

有一个为呼叫之前智能指针任何没有地方。现在之后这个调用你可以把ip分配给某种智能指针。不要忘记自定义删除器,您将需要它。

请注意,ip实际上指向一个链接列表实现与纯原始哑诚实指针,你不能改变。智能指针对列表头部的效用至多是有问题的。将信息复制到合适的C++容器并在调用之后立即处理链接列表可能是有意义的。