首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾收集和cgo

垃圾收集和cgo
EN

Stack Overflow用户
提问于 2012-03-03 01:47:54
回答 1查看 1.9K关注 0票数 11

有没有可能让Go中的垃圾回收器处理并释放通过C代码分配的内存?我很抱歉,我以前没有使用过C和cgo,所以我的例子可能需要一些澄清。

假设您有一些想要使用的C库,并且这个库分配了一些需要手动释放的内存。我想做的是这样的:

代码语言:javascript
复制
package stuff

/*
#include <stuff.h>
*/
import "C"

type Stuff C.Stuff

func 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分配内存的清理,方法是编写一个函数,当没有引用该对象时,运行时调用该函数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-03 02:27:46

存在runtime.SetFinalizer函数,但它不能用于由C代码分配的任何对象。

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

代码语言:javascript
复制
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)
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9537948

复制
相关文章

相似问题

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