For any addrinfo
您自己分配,使用安全new
and 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;