【发布时间】:2014-03-23 10:20:36
【问题描述】:
我需要处理两个 struct 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:使用新的安全吗? -
getaddrinfo需要一个指向addrinfo结构的指针的指针:我应该如何通过智能指针传递它? - 打电话给
freeaddrinfo怎么样?删除(或者更好的free)智能指针持有的指针被认为是不安全的。
hints 没有问题,因为它的生命周期更短。
【问题讨论】:
-
你自己并没有真正分配结果地址信息结构,是吗?它们由
getaddrinfo函数分配。并且可以为智能指针设置自定义删除器,可以调用freeaddrinfo。并且提示不必动态分配,即使您要多次使用相同的结构。只需在普通(非指针)结构变量上使用地址运算符即可。 -
这个构造函数是not safe,如果你的编译器支持它,你应该使用
std::make_unique,或者如果它不支持,你自己做一个等效的。您真的真的不想处理部分构造的内存泄漏。此外,如果你的基类要保存资源,你的基类析构函数应该是virtual -
@Mgetz 这只是一个让你找出问题所在的 sn-p。但是,我找不到
virtualdtor 的位置,因为基类不是抽象类。 -
@black 声明析构函数
virtual并不意味着纯虚拟,只是以virtual关键字为前缀,这样如果有人同时持有基类指针,则基类和派生类析构函数被调用 -
@Mgetz 这对 ctor 来说是安全的,因为成员按照声明的顺序进行初始化,其余成员可以使用
标签: sockets c++11 smart-pointers