簡體   English   中英

達爾文分配的getline緩沖區會發生什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM