套接字 – 带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是否安全? 对于提示没有问题,因为它的寿命较短. 解决方法
对于您自己分配的任何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; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |