我是cgo的新手,并且对内存管理有几个问题。
说我有一个简单的c函数如下:
char* get_str_in_arr(char **charArr, size_t i){
return charArr[i];
}
我是否需要释放内存,如下所示:
func doSomething(){
cStr := C.get_str_in_arr(feats, C.size_t(1))
goStr := C.GoString(cStr)
defer C.free(unsafe.Pointer(cStr))
...
}
如果是这种情况,我需要对从方法返回的任何变量执行此操作。例如,c Struct,uint32_t,...等
答案 0 :(得分:0)
用C语言比用Go来说更多。如果你(从你的C函数)返回一个指向某个已分配(如在malloc()
)内存中的指针 - 应该被释放(当然,如果在其他一些分配的内存中没有引用它通过C代码)。如果您返回一些结构(不是指向结构的指针)或整数 - 则没有任何东西可以释放。如果您正在返回一个指向某个静态内存的指针 - 不应该被释放。
因此,在您的示例中,问题是feats
是什么,如何分配,如何管理。鉴于目前的代码,您是否无法就是否需要free()
返回值给出明确的答案。