加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

套接字 – 带addrinfo结构的智能指针

发布时间:2020-12-16 09:50:40 所属栏目:百科 来源:网络整理
导读:我需要处理两个struct addrinfo指针.因为我用C(11)编码,所以我要使代码异常安全.实际上,我的结构可能会抛出runtime_error. 当你不再需要那种结构时,你应该调用freeaddrinfo来释放结构中的列表.请考虑以下代码: #include memory#include netdb.hclass SomeOt
我需要处理两个struct addrinfo指针.因为我用C(11)编码,所以我要使代码异常安全.实际上,我的结构可能会抛出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结构指针的指针:我应该如何通过智能指针传递它?
>如何调用freeaddrinfo?删除(或更好地释放)智能指针所持有的指针被认为是不安全的.

对于提示没有问题,因为它的寿命较短.

解决方法

对于您自己分配的任何addrinfo,使用new和delete是安全的,因此您可以使用unique_ptr的默认实现来处理它.

对于getaddrinfo()分配的任何addrinfo,您必须使用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没有覆盖&操作符:

addrinfo *temp;
getaddrinfo(...,&temp);
result.reset(temp);

更新:更好的选择是使用decltype并让编译器为您推导出Deleter的函数类型:

std::unique_ptr<addrinfo,decltype(&freeaddrinfo)> result;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读