Go 是否隐式地保持传递给 C 函数的指针的父结构保持活动状态?

问题描述 投票:0回答:1

考虑 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 函数?

go cgo
1个回答
0
投票

简单的答案是“否”,因为

a
b
无法从 C 代码访问。

函数调用

f(a.handle, b.handle)
,无论是 C 还是 Go,都会传递
a.handle
b.handle
中值的副本(指向
C.my_type
结构的指针),但除此之外,垃圾收集器可以自由释放
 a
b
当它们在其他地方没有引用时。

© www.soinside.com 2019 - 2024. All rights reserved.