达尔文分配的getline缓冲区会发生什么变化?

时间:2015-12-17 04:03:23

标签: c swift swift2.1 darwin

假设我在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分配的每个行缓冲区会发生什么?快速释放它还是内存泄漏?

1 个答案:

答案 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
    })
}