Освобождение структур Go объектов C - PullRequest
0 голосов
/ 03 марта 2019

При выделении отдельных объектов с помощью вызовов 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 и сигнал прерывания.

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

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

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

1 Ответ

0 голосов
/ 04 марта 2019

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

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

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

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

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


См. Go: Команда cgo .

...