我有一个对象的智能指针,我需要传递给一个只接受指针指针的方法。
以下是一个示例,其中原始智能指针失去了所有权。
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 。我担心这个功能可能是失去所有权的原因
我已经更新了我的代码示例,以反映我实际做的事情。
答案 0 :(得分: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();
答案 1 :(得分:3)
以下是一个示例,其中原始智能指针失去了所有权。
不。在调用get()
release()
后,unique_ptr将失去所有权
答案 2 :(得分:2)
你不需要这些。这是正确的调用序列:
pcap_if_t ip = nullptr;
res = pcap_findalldevs(&ip, errbuf);
// now ip (hopefully) points to something
在通话之前,没有地方指向任何的智能指针。现在在调用之后,您可以将ip
分配给某种智能指针。别忘了自定义删除器,你需要它。
请注意,ip
实际上指的是使用简单原始哑的诚实指针实现的链接列表,您无法更改。智能指针到列表头部的效用充其量是有问题的。将信息复制到合适的C ++容器并在调用后立即处理链接列表可能是有意义的。