首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾回收不适用于[]gocv.Mat

垃圾回收不适用于[]gocv.Mat
EN

Stack Overflow用户
提问于 2019-01-31 16:39:05
回答 1查看 478关注 0票数 0

假设img是代码中的3通道Mat。代码中存在内存泄漏。我猜测go中的垃圾回收不会删除片"matsplits“中的指针(引用)。我怎么才能修复它?

代码语言:javascript
复制
for{
    matsplits := gocv.Split(img)
    matsplits[0].Close()
    matsplits[1].Close()
    matsplits[2].Close()
}

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

更新:项目中的部分代码

代码语言:javascript
复制
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已被正确关闭。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-31 17:14:51

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

代码语言:javascript
复制
    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中实际做了什么

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54456414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档