【问题标题】:Get a pointer pointer for a smart pointer获取智能指针的指针指针
【发布时间】:2016-02-04 18:54:17
【问题描述】:

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

这是一个示例,原始智能指针失去了所有权。

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。恐怕该功能可能是失去所有权的原因。
我已经更新了我的代码示例以反映我实际所做的事情。

【问题讨论】:

  • 只要some_function 不拥有您传递给它的指针或其对象指向您正在做的事情的指针,就可以了。
  • get 不会转让所有权。 release,确实如此。
  • @Deleisha 问题清楚地表明:“我将如何做到这一点,没有 原始智能指针丢失指针所有权?” (强调我的)。
  • 现在你遇到了麻烦,阅读 pcap_findalldevs 的文档,你甚至可以避免 unique_ptr(如果内存由该库管理)
  • 将一个指向 pcap_findalldevs 的指针的地址传递给 pcap_findalldevs 是没有意义的。该函数将覆盖指针。

标签: c++ pointers smart-pointers unique-ptr


【解决方案1】:

将指针指向指针的函数通常会这样做,因为它可能会改变它,而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();

【讨论】:

    【解决方案2】:

    这是一个示例,原始智能指针失去了所有权。

    不。 unique_ptr 在调用get()后保留所有权

    unique_ptr 将在调用 release() 后失去所有权

    参考:http://en.cppreference.com/w/cpp/memory/unique_ptr

    【讨论】:

      【解决方案3】:

      你不需要这些。这是正确的调用顺序:

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

      在调用之前没有智能指针的位置。现在调用之后,您可以将ip 分配给某种智能指针。不要忘记自定义删除器,您将需要它。

      请注意,ip 实际上指向一个链表,该链表使用纯原始愚蠢的诚实指针实现,您无法更改。指向列表头部的智能指针的实用性充其量是值得怀疑的。将信息复制到合适的 C++ 容器并在调用后立即处理链表可能是有意义的。

      【讨论】:

        猜你喜欢
        • 2016-08-01
        • 2017-04-29
        • 1970-01-01
        • 1970-01-01
        • 2016-09-25
        • 1970-01-01
        • 2016-10-09
        • 2015-01-24
        • 2021-07-03
        相关资源
        最近更新 更多