【发布时间】:2014-11-07 22:14:41
【问题描述】:
我使用 cgo 绑定到 C api(子弹物理引擎),一些函数使用数据指针。这个想法是我可以将一个指针附加到一个对象上,然后在物理引擎调用回调时检索它。我的问题是,当我取回价值时,它会改变,而我没有这样做。似乎没有源代码明确更改该值。
碰撞对象:source,header, The go codes that interracts with that class
这是我如何发送值,重新转换为 *int 和 int 很好,打印正确的数字:
num := x*amounty*amountz + y*amountz + z + 1
ptr := unsafe.Pointer(&num)
fmt.Printf("created %v %v\n", ptr, *(*int)(ptr))
rb := sphere.RigidBody(ptr, 1)
但是当我从 raytest 中返回时,值发生了变化:
ptr := hit.GetUserPointer()
log.Printf("we got back: %v %v", ptr, *(*int)(ptr))
指针值本身没有变化,我可以查看一下,有一个指针指向这个位置,但是它指向的值不同。
现在我想知道是否可能 go 没有清理值(垃圾收集),因为它不再被使用并用其他东西替换了这个内存位置。
示例输出(已删除垃圾值):
created: 0xc2080006e0 40
2014/11/07 17:10:01 we got back: 0xc2080006e0 4921947622888946315
感谢任何指针(呵呵):)
【问题讨论】:
-
它正在被 GC 处理。您需要在 Go 中保持该指针处于活动状态,这样它就不会。
-
@JimB 同样,Go 的 GC 允许移动指针。在 C 端存储指针绝对不安全。
-
@Jsor,从技术上讲是正确的,但还没有。有很多代码将指针传递给 cgo,因为它是我们目前拥有的最好的。这应该是go1.5更好的定义。 (在这种情况下,虽然没有很好的理由使用指针,但将值复制进去)