考虑 Go 中的以下代码片段,它使用 cgo 来包装 C API:
/*
#include <myheader.h>
void MyCall(my_type* a, my_type* b);
*/
import "C"
// Go wrapper for native pointer to my_type.
// The struct can be assumed to have a finalizer set.
type MyType struct {
handle *C.my_type
}
func (a *MyType) MyCall(b *MyType) {
C.MyCall(a.handle, b.handle)
}
我的问题是,在函数
MyCall
中,变量runtime.KeepAlive
和a
需要
b
吗?
根据文档,作为函数参数传递给 C 函数的 Go 指针在调用期间隐式固定它们指向的内存。这是否扩展到作为函数参数传递给 C 函数的 Go 指针的父结构 C 函数?
简单的答案是“否”,因为
a
和 b
无法从 C 代码访问。
函数调用
f(a.handle, b.handle)
,无论是 C 还是 Go,都会传递 a.handle
和 b.handle
中值的副本(指向 C.my_type
结构的指针),但除此之外,垃圾收集器可以自由释放 a
和 b
当它们在其他地方没有引用时。