【发布时间】:2015-12-17 04:03:23
【问题描述】:
假设我用这样的方式快速调用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分配的每个行缓冲区会发生什么? swift释放它还是内存泄漏?
【问题讨论】:
-
鉴于您没有释放文档明确说明需要释放的内容,这是内存泄漏。
-
如何快速释放它?我知道如何在 C 中做到这一点,但不是间接地在 swift 中。