сборка мусора не работает с [] gocv.Mat на Голанге - PullRequest
0 голосов
/ 31 января 2019

Предположим, что img является 3-канальным матом в коде.Утечка памяти с кодом.Я предполагаю, что указатели (ссылки) в срезе "matsplits" не удаляются при сборке мусора в go.Как я могу это исправить?

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

Вид приведенных выше кодов вызывает утечку памяти.Я уверен, что объекты Mat в imgarr закрыты, но использование памяти все еще растет.Почему?

Обновление: часть кодов в моем проекте

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++
}

Утечка памяти происходит, если «testplit» не помечены.len (testsplit) равен 2. Я проверил, что testsplit [0] и testsplit [1] были закрыты правильно после testsplit [i] .Close ().

1 Ответ

0 голосов
/ 31 января 2019

После закрытия () память частично очистится после того, как придет 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, и вы можете найти, что gc фактически делает в xx.log

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...