![](/img/trans.png)
[英]Using statically allocated buffers in getline(3) / getdelim(3)
[英]What happens to Darwin allocated getline buffers?
假設我在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);
特定文檔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
分配的每個行緩沖區會發生什么? 快速釋放它還是內存泄漏?
緩沖區泄露。 調用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
})
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.