Можно ли заставить сборщик мусора в Go обрабатывать и освобождать память, выделенную с помощью кода C? Прошу прощения, я раньше не использовал C и cgo, поэтому мои примеры могут нуждаться в пояснении.
Допустим, у вас есть некоторая библиотека C, которую вы хотели бы использовать, и эта библиотека выделяет некоторую память, которую необходимо освободить вручную. Я бы хотел сделать что-то вроде этого:
package stuff
/*
#include <stuff.h>
*/
import "C"
type Stuff C.Stuff
func NewStuff() *Stuff {
stuff := Stuff(C.NewStuff()) // Allocate memory
// define the release function for the runtime to call
// when this object has no references to it (to release memory)
// In this case it's stuff.Free()
return stuff
}
func (s Stuff) Free() {
C.Free(C.Stuff(s)) // Release memory
}
Есть ли способ для сборщика мусора вызвать Stuff.Free (), когда в среде выполнения Go нет ссылок на * Stuff?
Имею ли я здесь смысл?
Возможно, более прямой вопрос: можно ли сделать так, чтобы среда выполнения автоматически обрабатывала очистку выделенной памяти C, написав функцию, которую среда выполнения вызывает при нулевых ссылках на этот объект ?