#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
и сигнал прерывания.
Я вижу три возможных ответа:
- Сборщику мусора Go известно об объектах, созданных с помощью
make
вызова, и поэтомуb
мусор будет собран средой выполнения Go. - Сборщику мусора Go известно о фрагменте, созданном с помощью
make
вызова, но не оC.uchar
s, содержащихся в фрагменте. Поэтому нам нужно пройти по фрагменту и освободить каждый элемент - Я вызываю освобождение фрагмента
b
неправильно.
Какие из моих выводов, если таковые имеются, верны? В противном случае, что происходит на самом деле?
Комментарии:
1. Вы вызываете,
free
если вы вызываете функцию Calloc
. Вы не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. Спасибо, это проясняет это для меня!