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 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?