2012-03-02 10 views
10

¿Es posible hacer el recolector de basura en el controlador Go y liberar la memoria asignada mediante el código C? Me disculpo, no he usado C y cgo antes, así que mis ejemplos pueden necesitar alguna aclaración.Recogida de basura y cgo

Digamos que tiene alguna biblioteca C que le gustaría usar y esta biblioteca asigna parte de la memoria que debe liberarse manualmente. Lo que me gustaría hacer es algo como esto:

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 
} 

¿Hay alguna manera para que el recolector de basura para llamar Stuff.Free() cuando no hay referencias a * cosas en el tiempo de ejecución Go?

¿Tengo sentido aquí?

Quizás una pregunta más directa es: ¿es posible hacer que el tiempo de ejecución maneje automáticamente la limpieza de la memoria asignada C escribiendo una función que llama el tiempo de ejecución cuando no hay referencias a ese objeto?

Respuesta

12

Existe la función runtime.SetFinalizer, pero no se puede utilizar en ningún objeto asignado por el código C.

Sin embargo, puede crear un objeto para cada objeto Ir C que necesita ser liberado de forma automática:

type Stuff struct { 
    cStuff *C.Stuff 
} 

func NewStuff() *Stuff { 
    s := &Stuff{C.NewStuff()} 
    runtime.SetFinalizer(s, (*Stuff).Free) 
    return s 
} 

func (s *Stuff) Free() { 
    C.Free(s.cStuff) 
} 
Cuestiones relacionadas