【问题标题】:Does the assignment to blank identifier lead to resource leak in Go?分配给空白标识符是否会导致 Go 中的资源泄漏?
【发布时间】:2022-01-03 16:57:55
【问题描述】:

如果我获得一些可关闭的资源(例如*os.File)并将其分配给空白标识符(_)怎么办?根据SO answer无法访问此变量,因此将在生成的程序之外对其进行优化。但它会正确关闭吗?示例代码如下。

func check(path string) bool {
    _, err := os.Open(path)
    if err != nil {
        return true
    }
    return false
}

【问题讨论】:

    标签: go memory-leaks


    【解决方案1】:

    无论你把文件赋值给空白标识符还是命名变量,如果你不显式调用它的Close()方法,它不会被关闭,会泄漏资源。

    如果将返回的*os.File 分配给空白标识符,则无法引用它,因此无法调用其Close() 方法。所以不要这样做。

    【讨论】:

    • 但是在分配给_ 之后我不能明确地关闭它,所以我们这里有类似悬空指针的东西。或者我可以吗?
    • @hant0508 是的,如果你把它赋值给_,你不能引用它,所以你不能调用它的Close()方法。所以不要这样做。
    • @jdizzle 很高兴知道这一点,但 runtime.SetFinalizer() 文件表明无法保证终结器会运行。
    • @jdizzle,这也是一个特定运行时的植入细节,Go 语言没有定义任何东西。
    • @jdizzle:请注意,仅在实际意义上,摊销意义也可能不够。假设某个进程(在 Linux-y 系统上)正在以 10 或 100 个文件的打开文件限制运行,而我们 check 一千个文件。在我们用完 fd 之前,我们会 GC 一些“丢失的”*os.File 对象吗?在这种情况下可能不会。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2015-11-29
    • 1970-01-01
    • 2013-03-27
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多