获取智能指针的指针指针
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()
后失去所有权
将指针指向指针的函数通常会这样做,因为它可能会改变它,而 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++ 容器并在调用后立即处理链表可能是有意义的。
我有一个对象的智能指针,我需要将其传递给一个只接受指针指针的方法。
举个例子,原来的智能指针失去了所有权。
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()
将指针指向指针的函数通常会这样做,因为它可能会改变它,而 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++ 容器并在调用后立即处理链表可能是有意义的。