假设img是代码中的3通道Mat。代码中存在内存泄漏。我猜测go中的垃圾回收不会删除片"matsplits“中的指针(引用)。我怎么才能修复它?
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,则会发生内存泄漏。我检查了在testspliti.Close()之后,testsplit和testsplit1已被正确关闭。
发布于 2019-01-31 17:14:51
在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在exec中实际做了什么
https://stackoverflow.com/questions/54456414
复制相似问题