垃圾收集不适用于Golang中的[] gocv.Mat

时间:2019-01-31 08:39:05

标签: opencv go garbage-collection

假设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]是否已正确关闭。

1 个答案:

答案 0 :(得分:1)

在Close()之后,内存将在gc出现之后部分清除。 像这样检查

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

exec像GODEBUG=gctrace=1 go run main.go 2>xx.log 您可以在xx.log中找到gc的实际作用