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

Можно ли заставить сборщик мусора в 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, написав функцию, которую среда выполнения вызывает при нулевых ссылках на этот объект ?

11
задан hannson 2 March 2012 в 17:47
поделиться