【问题标题】:Is there a way to release unmanaged resources when a Go struct is collected?有没有办法在收集 Go 结构时释放非托管资源?
【发布时间】:2012-08-02 10:28:38
【问题描述】:

我有一个指向由 Go 结构包裹的 C 类型的指针,如下所示:

type Wrapper struct {
    unmanaged *C.my_c_type
}

C 类型又具有以下功能:

my_c_type* make_c_type();
void free_c_type(my_c_type *ct);

有没有一种方法可以确保在Wrapper 实例完成时调用free_c_type

【问题讨论】:

    标签: garbage-collection interop go cgo


    【解决方案1】:

    您可以使用runtime.SetFinalizer。这允许您在对象超出范围时运行清理功能。不保证运行。但是,在释放内存时,这并不重要。重要的是,对于一个长时间运行的进程,它可能会控制垃圾。

    以下是文档的一些摘录(整个段落已被删除):

    SetFinalizer 将与 x 关联的终结器设置为 f。当垃圾收集器发现一个带有关联终结器的不可访问块时,它会清除关联并在单独的 goroutine 中运行 f(x)。这使 x 再次可访问,但现在没有关联的终结器。假设没有再次调用 SetFinalizer,那么下次垃圾收集器看到 x 不可达时,它会释放 x。

    x 的终结器计划在 x 变得无法访问后的某个任意时间运行。无法保证终结器会在程序退出之前运行,因此它们通常仅用于在长时间运行的程序期间释放与对象关联的非内存资源。例如,当程序在不调用 Close 的情况下丢弃 os.File 时,os.File 对象可以使用终结器来关闭关联的操作系统文件描述符,但是依赖终结器来刷新内存中的 I 是错误的。 /O 缓冲区,例如 bufio.Writer,因为缓冲区不会在程序退出时被刷新。

    单个 goroutine 依次运行程序的所有终结器。如果终结器必须运行很长时间,它应该通过启动一个新的 goroutine 来实现。

    【讨论】:

    • 我会赞成这个,但不幸的是我的帐户太新了。得到代表后我会处理的 :) 谢谢!
    • aaa 我们开始了 :) 再次感谢!
    猜你喜欢
    • 2015-05-27
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2013-10-01
    • 2011-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多