Cgo:Go语言分配的C语言写内存

wz8daaqr  于 2023-06-19  发布在  Go
关注(0)|答案(1)|浏览(138)

对于Go语言中的非结构切片

a := []byte{0,1,2,3,4,5,6,7}

并通过unsafe.Pointer()传递到C

C.some_method((*C.char)(unsafe.Pointer(&a[0])), C.int(len(a)))

在指针中写入任何内容是否安全,但要注意指针的长度?

void some_method(char* a, int a_len) {
    for (int i=0; i<a_len; i++) {
        a[i] = i+1;
    }
}
3htmauhk

3htmauhk1#

经过一点研究和阅读评论,我认为这里有几件事需要注意:

  • 对于C中的异步/多线程,你需要确保GC不会收集你的指针。这可以通过runtime.KeepAlive()完成
  • GC可能会移动你的内存分配。如果unsafe.Pointer这样做,它将不会获得更新(https://pkg.go.dev/unsafe#Pointer)。但是很快就会有一个pin机制(https://github.com/golang/go/issues/46787)。
  • //go:uintptrescapes不太可能用于CGO,请谨慎使用。

相关问题