gpt4 book ai didi

sockets - 带有 addrinfo 结构的智能指针

转载 作者:行者123 更新时间:2023-12-01 09:57:47 25 4
gpt4 key购买 nike

我需要处理两个结构 addrinfo指针。由于我使用 C++(11) 进行编码,因此我必须使我的代码异常安全。确实,我的 costructors 可能会抛出 runtime_error .
当你不再需要那种结构体时,你应该调用 freeaddrinfo为了释放结构内的列表。请考虑以下代码:

#include <memory>
#include <netdb.h>

class SomeOtherClass
{
public:
SomeOtherClass() : hints(new addrinfo), result(new addrinfo) { /*stuff*/ }
~SomeOtherClass() { freeaddrinfo(result.get()); } // bad things will happen

private:
std::unique_ptr<addrinfo> hints, result;
};

class MyClass : public SomeOtherClass
{
public:
MyClass() { /* hints initialization, call to getaddrinfo, etc. */ }

private:
// ...
};

我的问题是:
  • addrinfo是一个“旧的”C 结构,没有可调用的 ctor/dtor:使用 new 安全吗?
  • getaddrinfo需要一个指向 addrinfo 的指针的指针struct:我应该如何通过智能指针传递它?
  • 打电话怎么样freeaddrinfo ?删除(或更好的 free )智能指针所持有的指针被认为是不安全的。

  • 对于 hints没有问题,因为它的生命周期更短。

    最佳答案

    对于任何 addrinfo你自己分配,用起来很安全newdelete ,因此您可以使用 unique_ptr 的默认实现处理那个。

    对于任何 addrinfo那个getaddrinfo()分配,必须使用 freeaddrinfo()释放它。您仍然可以使用 unique_ptr为此,但您必须指定 freeaddrinfo()作为定制 Deleter ,例如:

    class SomeOtherClass
    {
    public:
    SomeOtherClass() : hints(new addrinfo), result(nullptr, &freeaddrinfo) { /*stuff*/ }

    private:
    std::unique_ptr<addrinfo> hints;
    std::unique_ptr<addrinfo, void(__stdcall*)(addrinfo*)> result;
    };

    然后你可以这样做:
    getaddrinfo(..., &result);

    或者这个,如果 std::unique_ptr不会覆盖 &运算符(operator):
    addrinfo *temp;
    getaddrinfo(..., &temp);
    result.reset(temp);

    更新 :更好的选择是使用 decltype并让编译器推导出 Deleter的函数类型为你:
    std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> result;

    关于sockets - 带有 addrinfo 结构的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21942280/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com