带有 addrinfo 结构的智能指针

2024-01-08

我需要处理两个结构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:
    // ...
};

我的问题是:

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

For hints没有问题,因为它的寿命较短。


For any addrinfo您自己分配,使用安全newand delete,因此您可以使用默认实现unique_ptr来处理这个问题。

For any addrinfo that getaddrinfo()分配,你必须使用freeaddrinfo()来释放它。您仍然可以使用unique_ptr为此,但您必须指定freeaddrinfo()作为一种习俗Deleter, eg:

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);

UPDATE:更好的选择是使用decltype并让编译器推断出函数类型Deleter为你:

std::unique_ptr<addrinfo, decltype(&freeaddrinfo)> result;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有 addrinfo 结构的智能指针 的相关文章

随机推荐

  • mod_php 和 cgi php 脚本有什么区别?

    mod php 和 cgi php 脚本有什么区别 我的意思是 为什么最好 是吗 使用 mod php 而不是简单的 php 脚本 并将它们作为 CGI 运行 Thanks 使用 CGI 时 PHP 进程由 Apache 启动 并且是该 P
  • SLComposeViewController 完成处理程序

    您好 如果使用 SLComposeViewController CompletionHandler 完成推文 我如何收到通知 这是发送推文的代码 if SLComposeViewController isAvailableForServic
  • 在没有 IIS 和 VS 2017 的情况下使用 Kestrel

    依赖于微软文档 Kestrel 可以单独使用 也可以与反向代理服务器 例如 IIS Nginx 或 Apache 一起使用 反向代理服务器接收来自 Internet 的 HTTP 请求 并在进行一些初步处理后将它们转发到 Kestrel 如
  • 使用导数和雅可比增强 odeint 类

    我打算在 MCMC 例程中使用 Boost odeint 库来估计 ODE 模型中的参数 由于这些 ODE 可能很僵硬 因此我需要能够将雅可比矩阵与导数一起传递到求解器中 我想创建一个类 其中参数和初始值作为私有成员 然后将导数 雅可比和更
  • 我应该在私有/内部方法中添加空参数吗?

    我正在编写一个库 它具有多个公共类和方法 以及库本身使用的多个私有或内部类和方法 在公共方法中 我有一个空检查和一个抛出 如下所示 public int DoSomething int number if number null throw
  • Java:使用异步编程优化应用程序

    我必须修改 dropwizard 应用程序以提高其运行时间 基本上 该应用程序每天接收大约 300 万个 URL 并下载和解析它们以检测恶意内容 问题是该应用程序只能处理 100 万个 URL 当我查看该应用程序时 我发现它正在进行大量顺序
  • 将文件下载到特定文件夹 python

    我可以从以下位置下载文件URL以下方式 import urllib2 response urllib2 urlopen http www someurl com file pdf html response read 我能想到的一种方法是以
  • 从流中读取数据的最有效方法

    我有一种使用对称加密来加密和解密数据的算法 无论如何 当我要解密时 我有 CryptoStream cs new CryptoStream ms cryptoTransform CryptoStreamMode Read 我必须从 cs C
  • 来自产品 ID 的 MSI 产品代码?

    我正在尝试将 MSI 产品代码 GUID 转换为用于标识 MSI 注册表项中已安装项目的产品代码 ID 有这方面的API吗 如果不是 这该怎么办 Warning Microsoft 强烈建议您不要弄乱他们的 MSI 注册表项 但如果您确实必
  • 如何删除 AWS ECS 任务定义?

    在 Amazon 的 EC2 容器服务中创建任务定义后 如何删除或移除它 It s a 已知问题 https forums aws amazon com thread jspa threadID 170378 一旦取消注册任务定义 它就会进
  • PHP:没有连接的字符串中的变量

    如果我在这个字符串中有一个变量 var echo Hello there are many vars Php 寻找variable vars代替 var 没有连接 如 Hello there are many var s 还有另一种方法可以
  • Jboss不部署战争,JBAS011006

    我需要你的帮助 我正在尝试将 WAR 部署到 Jboss Application Server 7 1 但无法实现 我通过 Web 控制台部署它 它在部署过程中冻结 没有任何错误 这是我的 server log http rghost ru
  • HTML5

    我想知道这是什么意思
  • 更好的说法是 x == Foo::A || x == Foo::B || x == Foo::C || ...?

    假设我有一堆众所周知的价值观 就像这样 但是const char 这只是一个例子 可能更复杂 const char A A B B C C D D E E F F G G 现在假设如果某个表达式的结果位于这些表达式的子集中 我想以特定的方式
  • 简单的 yacc 语法给出错误

    我有一个关于 yacc 编译器的问题 我不编译简单的 yacc 语法 这是代码部分 anbn 0 y token A B start anbn n printf is in anbn 0 n return 0 anbn empty A an
  • before(:each) 与之前

    我是 ruby on Rails 的新手 并进行测试 之间有区别吗 before each do some test code end and before do some test code end The before方法接受一个sco
  • write()-Python 3.x 中的编码字符串

    我有一个 unicode 字符串 我想将其写入文件中 在 Python 2 中我可以这样写 open filename w write s encode utf 8 但这对于 Python 3 来说失败了 显然 s encode 返回 by
  • 如何根据文本长度增加UITextview高度,如whatsapp

    我已经使用 websocket 在我的 iOS 应用程序中实现了聊天功能 它对我来说工作得很好 问题是我想增加 UITextView 的高度 而 UITableView 应该根据 UITextView 增加的高度向上移动 谁能帮我 以下是我
  • 使用过滤器返回对象中的属性值

    尝试创建一个使用 filter 但不使用 for 或 while 循环或 foreach 函数的函数 该函数将循环遍历对象数组 仅返回其属性值 例如 function getShortMessages messages return mes
  • 带有 addrinfo 结构的智能指针

    我需要处理两个结构addrinfo指针 由于我使用 C 11 进行编码 因此我必须使代码异常安全 事实上 我的构造函数可能会抛出一个runtime error 当你不再需要那种结构时 你应该调用freeaddrinfo为了释放结构内的列表