Освобождение Go-структур объектов C

#go #cgo

#Вперед #cgo

Вопрос:

При выделении отдельных объектов с помощью C.malloc основанных вызовов мы должны освобождать новые элементы, поскольку сборщик мусора Go не знает о них.

НАПРИМЕР:

 s := C.CString(l)
defer C.free(unsafe.Pointer(s))
  

Однако, когда мы создаем фрагмент объектов C, нужно ли их освобождать?

НАПРИМЕР:

b := make([]C.uchar, C.int(40))

Я пытался использовать что-то вроде defer C.free(unsafe.Pointer(amp;b[0])) однако, которое выдает free(): invalid pointer и сигнал прерывания.

Я вижу три возможных ответа:

  1. Сборщику мусора Go известно об объектах, созданных с помощью make вызова, и поэтому b мусор будет собран средой выполнения Go.
  2. Сборщику мусора Go известно о фрагменте, созданном с помощью make вызова, но не о C.uchar s, содержащихся в фрагменте. Поэтому нам нужно пройти по фрагменту и освободить каждый элемент
  3. Я вызываю освобождение фрагмента b неправильно.

Какие из моих выводов, если таковые имеются, верны? В противном случае, что происходит на самом деле?

Комментарии:

1. Вы вызываете, free если вы вызываете функцию C alloc . Вы не malloc ничего сделали, поэтому вы не вызываете free

Ответ №1:

Это не так сложно.

cgo генерирует Go-тип, C.uchar расположение памяти которого точно соответствует C типу unsigned char .

Выражение Go make([]C.uchar, 40) , как обычно, выделяет фрагмент Go с базовым массивом типа Go C.uchar .

В Go есть сборщик мусора (GC). Когда больше нет ссылок Go на фрагмент и его базовый массив, он подходит для сборки мусора Go.

Go GC не знает ни о каком коде C и не заботится о нем.


Смотрите Go: Command cgo.

Комментарии:

1. Спасибо, это проясняет это для меня!