Возможно ли сделать сборщик мусора в дескрипторе 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 stuff.Free()
return stuff
}
func (s Stuff) Free() {
C.Free(C.Stuff(s)) // Release memory
}
Есть ли способ, чтобы сборщик мусора вызывал Stuff.Free(), когда нет ссылок на * Stuff в run runtime?
Имею ли смысл здесь?
Возможно, более прямой вопрос: возможно ли, чтобы среда выполнения автоматически обрабатывала очистку выделенной памяти C, записывая функцию, которую выполняет среда выполнения, когда нулевые ссылки на этот объект?