gpt4 book ai didi

pointers - cgo指针值改变

转载 作者:IT王子 更新时间:2023-10-29 02:16:41 26 4
gpt4 key购买 nike

我使用 cgo 绑定(bind)到 C api(子弹物理引擎),一些函数使用数据指针。我的想法是,我可以将一个指针附加到一个对象,并在稍后物理引擎调用回调时检索它。我的问题是,当我取回值(value)时,它发生了变化,而我没有这样做。似乎没有源代码明确地更改值。

碰撞对象: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)

但是当我从光线测试中返回时,值发生了变化:

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

感谢任何指针(呵呵):)

最佳答案

Go 的垃圾收集器不知道 C 或 C++ 代码持有的指针,因此没有什么可以让 num 变量保持事件状态。

您可以通过在 Go 变量中存储指针的第二个副本来解决这个问题。一种方法是使用类型为 map[*C.some_c_type]*int 或类似类型的全局变量,并将 &num 也存储在那里。请记住使用互斥锁保护 map ,以便在您具有并发访问权限时一切正常。

为了不泄漏,当底层 C 代码不再持有对它的引用时,您需要从映射中手动删除 &num。如果 C 库提供了在存储用户指针时设置销毁通知函数的功能,这将很容易:只需将 Go 函数导出到 C 并将其用作通知函数即可。如果没有,但 Go 绑定(bind)知道指针何时结束(例如,如果 RigidBody 变量始终通过 Go API 释放,您可以在那里进行清理。

关于pointers - cgo指针值改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26810985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com