You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go向C函数传递结构体指针时防GC回收的方案是否可行?

问题解答

1. 上述方案是否能正常生效?

当前Go的标准实现下可以正常生效。全局people map持有了所有你创建的*Person指针的强引用,GC扫描时会判定这些Person结构体对象仍然可达,不会被回收,因此你将指针转成uintptr传给C函数的整个周期里,对应的内存都是合法有效的。

注意:你贴的代码存在编译错误,Person结构体定义中没有声明name字段,但初始化时传入了name: "John"和name: "Mary",需要调整结构体定义或者初始化逻辑才能正常运行。

2. 是否存在结构体被移动导致指针失效的风险?

不存在这个风险:

  • 目前Go的GC实现是非移动的,堆上分配的对象地址一旦确定,全程不会发生变化,Go官方至今没有推出移动GC的规划。
  • 你这里的*Person指针被存入了全局map,对象肯定会逃逸到堆上,不会分配在栈上,也就不会因为栈扩缩容被移动,转成uintptr后的地址是完全稳定的。

3. 如果不调用deletePeople()会有什么问题?

会造成内存泄漏:

  • 全局people map会一直持有所有*Person的强引用,这些Person结构体占用的内存永远不会被GC回收,只要程序不退出,这部分内存就会一直被占用。
  • 如果是短生命周期程序,运行完就退出的话影响不大,进程退出后操作系统会自动回收所有内存;但如果是常驻进程,且会频繁创建新的Person对象又不清理,内存占用会持续上涨,最终可能触发OOM被系统杀死。

内容的提问来源于stack exchange,提问作者rodrigocfd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 16:45:10