登录
首页 >  Golang >  Go问答

垃圾收集不适用于 gocv.Mat

来源:stackoverflow

时间:2024-04-19 18:09:35 132浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《垃圾收集不适用于 gocv.Mat》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

假设代码中img是一个3通道mat。 代码存在内存泄漏。 我猜想切片“matsplits”中的指针(引用)不会被go中的垃圾收集删除。我该如何修复它?

for{
    matsplits := gocv.split(img)
    matsplits[0].close()
    matsplits[1].close()
    matsplits[2].close()
}

上述代码会导致内存泄漏。我确信imgarr中的mat对象已关闭,但内存使用量仍在增长。为什么?

更新:我的项目中的部分代码

processed := 0
for processed < proc.imgNumber {
    grayhconcatImg := <-proc.processedImg[0][chindex]
    var roiList roilist
    var numStartPosList numStartPos
    for x := 0; x < 11520-w; x++ {
        test := gocv.NewMat()
        testRegion := grayhconcatImg.img.Region(image.Rect(x, 0, x+w, h))
        gocv.BitwiseXor(chimg, testRegion, &test)
        testRegion.Close()
        //testsplit := gocv.Split(test)
        test.Close()
        //testsplit[0].Close()
        //testsplit[1].Close()

    processed++
}

如果“testsplit”未标记,则会发生内存泄漏。 len(testsplit) 是 2。 我已经检查过在testsplit[i].close()之后testsplit[0]和testsplit[1]是否已正确关闭。


解决方案


close()后,gc到来后,内存会被部分清除。 检查一下就像

matsplits := gocv.Split(img)
    matsplits[0].Close()
    matsplits[1].Close()
    matsplits[2].Close()
    runtime.GC()

godebug=gctrace=1 一样执行 go run main.go 2>xx.log 您可以在 xx.log 中找到 gc 实际执行的操作

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《垃圾收集不适用于 gocv.Mat》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>