当前位置: > > > > 垃圾收集不适用于 gocv.Mat
垃圾收集不适用于 gocv.Mat
来源:stackoverflow
2024-04-19 18:09:35
0浏览
收藏
一分耕耘,一分收获!既然打开了这篇文章《垃圾收集不适用于 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》文章吧,也可关注米云公众号了解相关技术文章。
