【发布时间】:2016-10-04 16:28:23
【问题描述】:
POSIX getaddrinfo 分配稍后必须使用freeaddrinfo 释放的内存。
见http://manpages.ubuntu.com/manpages/xenial/en/man3/getaddrinfo.3.html
为了简化 API,我创建了这个函数:
import Foundation
enum SystemError: Swift.Error {
case getaddrinfo(Int32, Int32?)
}
public func getaddrinfo(node: String?, service: String?, hints: addrinfo?) throws -> [addrinfo] {
var err: Int32
var res: UnsafeMutablePointer<addrinfo>?
if var hints = hints {
err = getaddrinfo(node, service, &hints, &res)
} else {
err = getaddrinfo(node, service, nil, &res)
}
if err == EAI_SYSTEM {
throw SystemError.getaddrinfo(err, errno)
}
if err != 0 {
throw SystemError.getaddrinfo(err, nil)
}
defer {
freeaddrinfo(res)
}
var result = [addrinfo]()
var ai = res?.pointee
while ai != nil {
result.append(ai!)
ai = ai!.ai_next?.pointee
}
return result
}
不过,我不觉得这个函数是正确的。
- Swift 内存模型如何知道
getaddrinfo分配了内存,而 Swift 不应该用自己的东西覆盖该内存? - Swift 怎么知道
freeaddrinfo删除了整个列表,它应该复制出分配给结果数组的ai 信息?
与getaddrinfo 交互的正确方式是什么?
【问题讨论】:
标签: swift memory posix low-level-api