我有一个对象的智能指针,我需要传递给一个只接受指针指针的方法。
下面是一个示例,其中原始智能指针失去了所有权。
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++容器并在调用后立即处理链表可能是有意义的。