cgo 内存释放
介绍
使用 cgo,Go 可以与 C 语言代码进行交互,但是在使用过程中,如果使用的姿势不对,那么就有可能带来内存泄漏问题。
Go 自带 GC,一般情况下不会发生内存泄漏事件,自带的 GC 会收集不再使用的对象,并将其释放。但是在使用 cgo 时,某些函数会将 C 语言对象分配到 C 的堆上,在 Go 中初始化的 C 对象,是需要显示的调用 C.free() 去释放。官方文档也写明了这一点。在 cgo 的使用文档中,有关于 CString 函数的一段描述:
The C string is allocated in the C heap using malloc. It is the caller’s responsibility to arrange for it to be freed, such as by calling C.free (be sure to include stdlib.h if C.free is needed).
在将 Go 类型转化为 C 类型的函数中都有着相关的说明。
因此,分配在 C 堆上的内存需要调用 C.free() 去释放。
例子
以下的代码来自 cgo 官方博客,演示了如何使用 cgo 调用 c 语言代码
1 |
|
在代码的最后一行,通过调用 C.free() 手动释放了内存。
为了保证内存的正确释放,可以通过 defer 语句来释放内存。
1 |
|
cgo 内存释放
https://blog.zhangliangliang.cc/post/cgo-memory-free.html