2012-03-02 24 views
10

Çöp toplayıcısını Git tutamacında tutabilmek ve C koduyla ayrılan belleği serbest bırakmak mümkün mü? Özür dilerim, C ve cgo'yu daha önce kullanmadım, bu yüzden örneklerin bazı açıklamalara ihtiyacı olabilir.Çöp toplama ve saklama kutusu

Kullanmak istediğiniz bazı C kitaplığınızın olduğunu ve bu kitaplığın el ile serbest bırakılması gereken bir bellek ayırdığını varsayalım.

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 
} 

herhangi bir şekilde Git zamanında hiçbir referanslar için * Stuff olduğunda Stuff.Free() çağırmak için çöp toplayıcısı için var mı: Böyle bir şey Ne yapmak istiyorum nedir?

Burada anlamlı mıyım?

Belki de daha doğrudan bir soru şudur: Çalışma zamanının, söz konusu nesneye sıfır referans olduğunda çalışma zamanının çalacağı bir işlev yazarak C ayrılmış belleğin temizlenmesini otomatik olarak gerçekleştirmesi mümkün müdür?

cevap

12

runtime.SetFinalizer işlev var, ancak C kodu tarafından ayrılan herhangi bir nesne üzerinde kullanılamaz.

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) 
} 
:

Ancak, otomatik olarak serbest gereken her C nesnesi için bir git nesnesi oluşturabilir

İlgili konular