dongyi9023 2017-02-27 00:04 采纳率: 0%
浏览 64
已采纳

指针是否由于垃圾回收而改变了Go中的值?

I'm a relative newbie to go. I have been working a lot with cgo and building an interface to a C api. The C api uses a registered callback and a void* cookie parameter to the callback.

Here is some code exemplifying my problem:

/*
void cb(void *cookie) {
   callGo(cookie);
}

go_register_cb(void *ptr) {
   register_cb(&cb, ptr);
}
*/
import "C"

and

import "C"

//export callGo
callGo(ptr unsafe.Pointer) {
    x := (*MyStruct)(ptr)
    x.doSomething()
}

func (x *MyStruct) Start() {
    C.go_register_cb(unsafe.Pointer(x))
}

This code causes a runtime error about Go pointers to Go pointers.

I think I understand the basic implications of keeping Go pointer inside C-land, which is that the C-land reference will not be accounted for in the go garbage collector so C may end up using a stale reference.

The specific requirement that I cannot pass a Go pointer to a data-structure that itself contains a Go pointer is more puzzling. The only thing that makes sense to me is that pointers in Go may change value (that is, the address they point to) due to garbage collection. Is this the case?

  • 写回答

1条回答 默认 最新

  • doutao1282 2017-02-27 01:47
    关注

    These rules for passing pointer between Go code and C code are dynamically checked at runtime. So when you break them the error occur.

    And your guess is right. Addresses are allowed to change due to garbage collection (Pointers are updated).

    Note here from golang.org:

    Even if a uintptr holds the address of some object, the garbage collector will not update that uintptr's value if the object moves, nor will that uintptr keep the object from being reclaimed.

    So moving object due to gc is possible.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。