假设我在swift中使用以下内容调用getline:
import Darwin
let byLine = { (file : UnsafeMutablePointer<FILE>) in
anyGenerator({ () -> String? in
var input = UnsafeMutablePointer<Int8>()
var lim = 0
return getline(&input, &lim, file) > 0 ? String.fromCString(input) : nil
})
}
请注意ssize_t getline(char **lineptr, size_t *n, FILE *stream);
的具体文档:
如果* lineptr设置为NULL并且* n在调用之前设置为0,则 getline()将分配一个缓冲区来存储该行。这个缓冲区 即使getline()失败,也应该被用户程序释放。
现在假设我有:
let fd = fopen("a_billion_lines_of_text.txt", "r")
for line in byLine(fd) {
...
}
当for
循环逐行读取该文件时,十亿行文本会发生什么?
此代码适用于逐行读取文件,但getline
分配的每个行缓冲区会发生什么?快速释放它还是内存泄漏?
答案 0 :(得分:4)
缓冲区泄露。调用getline
后需要释放内存。这是你如何做到的。
let byLine = { (file : UnsafeMutablePointer<FILE>) in
anyGenerator({ () -> String? in
var input = UnsafeMutablePointer<Int8>()
var lim = 0
let numChars = getline(&input, &lim, file)
defer {
free(input)
}
return numChars > 0 ? String.fromCString(input) : nil
})
}