При выделении отдельных объектов с помощью вызовов C.malloc
мы должны освободить новые элементы, так как сборщик мусора Go не знает о них.
EG:
s := C.CString(l)
defer C.free(unsafe.Pointer(s))
Однако когдамы создаем часть объектов C, нужно ли их освобождать?
EG:
b := make([]C.uchar, C.int(40))
Я пытался использовать что-то вроде defer C.free(unsafe.Pointer(&b[0]))
, но этовыдает free(): invalid pointer
и сигнал прерывания.
Я вижу три возможных ответа:
- Сборщик мусора Go знает об объектах, созданных с помощью вызова
make
, и поэтому b
будет собирать мусор во время выполнения Go. - Сборщик мусора Go знает о срезе, созданном с помощью вызова
make
, но не о C.uchar
, содержащихся в срезе.Поэтому нам нужно пройти через ломтик и освободить каждый элемент - Я называю освобождение ломтика
b
неправильно.
Который, если таковые имеются, из моих выводовверно?Иначе, что на самом деле происходит?