У меня есть следующий код в Go, который использует cgo:
func foo() {
bar := new(C.struct_bar)
...
}
Будет ли bar собираться после того, как функция завершит свое выполнение, или мне нужно явно вызвать free?
У меня есть следующий код в Go, который использует cgo:
func foo() {
bar := new(C.struct_bar)
...
}
Будет ли bar собираться после того, как функция завершит свое выполнение, или мне нужно явно вызвать free?
Да, несмотря на то, что struct_bar
относится к типу C, память выделяется Go и собирается Go.
Однако любая память, выделенная в C, не отслеживается Go GC. Код C должен справиться с этим самостоятельно, но в таких случаях, как C.CString
, когда Go инициирует выделение памяти, вы должны вручную освободить память с помощью C.free
.
new(C.char)
выделяет один байт, который позже будет собран сборщиком мусора. Если функция C собирается выделить память, ничего не выделяйте в go, просто передайте указатель.
- person JimB; 31.03.2016