從文件讀取數據時遇到內存泄漏。此代碼創建了泄漏:從文件句柄讀取數據在Linux上泄漏內存
func read() throws {
let url = URL(fileURLWithPath: "content.pdf")
let fileHandle = try FileHandle(forReadingFrom: url)
while true {
let chunk = fileHandle.readData(ofLength: 256)
guard !chunk.isEmpty else {
break
}
}
print("read")
}
do {
for _ in 0 ..< 10000 {
try read()
}
}
catch {
print("Error: \(error)")
}
* FYI:運行這段代碼,你將不得不在你的工作目錄下的「content.pdf」文件。
如果我使用Swift 3.1.1(或3.1)在Linux上運行此代碼,它會執行一些循環的迭代,消耗越來越多的內存,直到進程終止。
在Mac上,這也會發生,因爲數據被放入Autorelease池中,我可以通過將每次迭代包裝在autorelease池中來解決內存問題,但是這在Linux中不存在,所以我不知道如何才能釋放增加內存。有人有想法嗎?
請看看swift用戶郵件列表:希望這可以提供幫助。 https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20161031/003823.html –
@LuisRamirez是的謝謝你,我發現之前已經發布。自動發佈池不用於FileHandle/Data的Linux實現。最後,我深入研究了corelibs代碼,發現了最終的錯誤,並提出了一種解決方法(以下回答)。 – drewag