【发布时间】:2013-12-20 05:07:55
【问题描述】:
当使用 CGo 将 C 代码与 Go 接口时,如果我在 C 端保留对 Go 变量的引用,我是否会冒该对象被垃圾收集器释放的风险,或者 GC 会看到指针中的指针吗? C端管理的变量?
为了说明我的要求,请考虑以下示例程序:
转码:
package main
/*
typedef struct _Foo Foo;
Foo *foo_new(void);
void foo_send(Foo *foo, int x);
int foo_recv(Foo *foo);
*/
import "C"
//export makeChannel
func makeChannel() chan int {
return make(chan int, 1)
}
//export sendInt
func sendInt(ch chan int, x int) {
ch <- x
}
//export recvInt
func recvInt(ch chan int) int {
return <-ch
}
func main() {
foo := C.foo_new()
C.foo_send(foo, 42)
println(C.foo_recv(foo))
}
C 代码:
#include <stdlib.h>
#include "_cgo_export.h"
struct _Foo {
GoChan ch;
};
Foo *foo_new(void) {
Foo *foo = malloc(sizeof(Foo));
foo->ch = makeChannel();
return foo;
}
void foo_send(Foo *foo, int x) {
sendInt(foo->ch, x);
}
int foo_recv(Foo *foo) {
return recvInt(foo->ch);
}
我是否会冒foo->ch 在foo_new 和foo_send 调用之间被垃圾收集器释放的风险?如果是这样,有没有办法从 C 端固定 Go 变量,以防止它在我持有对它的引用时被释放?
【问题讨论】:
-
似乎没有办法阻止 Go 的垃圾收集器,除了关闭它。 blog.golang.org/c-go-cgo 说
Memory allocations made by C code are not known to Go's memory manager.所以我假设如果你想保留对 Go 的引用,你需要将 Go 值复制到 C 变量中。 -
博客文章的那部分似乎只是说在 C 中分配的内存不会被 Go 的 GC 释放,这不是我要问的:而不是问
Foo结构,我想知道我存储了一个指针的通道的生命周期是多少。复制变量不是通道之类的选项(出于显而易见的原因)。
标签: garbage-collection go cgo