Сборка мусора в cgo

У меня есть следующий код в Go, который использует cgo:

  func foo() {
       bar := new(C.struct_bar)
       ...
  }

Будет ли bar собираться после того, как функция завершит свое выполнение, или мне нужно явно вызвать free?


person user2424276    schedule 31.03.2016    source источник


Ответы (1)


Да, несмотря на то, что struct_bar относится к типу C, память выделяется Go и собирается Go.

Однако любая память, выделенная в C, не отслеживается Go GC. Код C должен справиться с этим самостоятельно, но в таких случаях, как C.CString, когда Go инициирует выделение памяти, вы должны вручную освободить память с помощью C.free.

person JimB    schedule 31.03.2016
comment
Далее, если бы я выделил указатель C char, используя точку := new(C.char), а затем передал его в качестве аргумента функции C, которая выделила некоторую память для этого указателя, тогда эта память была бы освобождена мусором коллектор или нет? - person user2424276; 31.03.2016
comment
@ user2424276: new(C.char) выделяет один байт, который позже будет собран сборщиком мусора. Если функция C собирается выделить память, ничего не выделяйте в go, просто передайте указатель. - person JimB; 31.03.2016