cgo мне нужно освободить память для переменной, возвращаемой функцией C, чтобы перейти

Я новичок в 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, ... и т.д.


person Westy10101    schedule 02.09.2016    source источник


Ответы (1)


Думайте об этом больше с точки зрения C, чем с точки зрения Go. Если вы возвращаете (из вашей функции C) указатель на некоторую выделенную (как в malloc()) память, которая должна быть освобождена (если, конечно, на нее не ссылается какая-либо другая память, выделенная кодом C). Если вы возвращаете некоторую структуру (не указатель на структуру) или целое число, освобождать нечего. Если вы возвращаете указатель на некоторую статическую память, которую не следует освобождать.

Итак, в вашем примере это вопрос о том, что такое feats, как он был выделен, как он управляется. Учитывая текущий код, просто невозможно дать окончательный ответ о том, нужно ли вам free() возвращаемое значение или нет.

person Roman Khimov    schedule 02.09.2016