我需要为C函数返回的变量释放内存

时间:2016-09-02 08:48:46

标签: c memory-management go cgo

我是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,...等

1 个答案:

答案 0 :(得分:0)

用C语言比用Go来说更多。如果你(从你的C函数)返回一个指向某个已分配(如在malloc())内存中的指针 - 应该被释放(当然,如果在其他一些分配的内存中没有引用它通过C代码)。如果您返回一些结构(不是指向结构的指针)或整数 - 则没有任何东西可以释放。如果您正在返回一个指向某个静态内存的指针 - 不应该被释放。

因此,在您的示例中,问题是feats是什么,如何分配,如何管理。鉴于目前的代码,您是否无法就是否需要free()返回值给出明确的答案。