为了账号安全,请及时绑定邮箱和手机立即绑定

垃圾收集和CGO

垃圾收集和CGO

Go
慕娘9325324 2021-04-30 18:01:01
是否有可能使Go中的垃圾收集器处理并释放通过C代码分配的内存?抱歉,我之前没有使用过C和cgo,因此我的示例可能需要澄清。假设您有一些要使用的C库,并且该库分配了一些需要手动释放的内存。我想做的是这样的:package stuff/*#include <stuff.h>*/import "C"type Stuff C.Stufffunc NewStuff() *Stuff {    stuff := Stuff(C.NewStuff()) // Allocate memory    // define the release function for the runtime to call    // when this object has no references to it (to release memory)       // In this case it's stuff.Free()         return stuff}func (s Stuff) Free() {    C.Free(C.Stuff(s)) // Release memory}在Go运行时中没有对* Stuff的引用时,垃圾收集器是否可以调用Stuff.Free()?我在这里有意义吗?也许更直接的问题是:是否有可能通过编写一个在该对象的引用为零时运行时调用的函数来使运行时自动处理C分配的内存的清理?
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

存在该runtime.SetFinalizer功能,但不能在C代码分配的任何对象上使用。


但是,您可以为每个需要自动释放的C对象创建一个Go对象:


type Stuff struct {

    cStuff *C.Stuff

}


func NewStuff() *Stuff {

    s := &Stuff{C.NewStuff()}

    runtime.SetFinalizer(s, (*Stuff).Free)

    return s

}


func (s *Stuff) Free() {

    C.Free(s.cStuff)

}


查看完整回答
反对 回复 2021-05-10
  • 1 回答
  • 0 关注
  • 229 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信