2012-03-02 13 views
10

Goでガベージコレクタを作成し、Cコードで割り当てられたメモリを解放することはできますか?私は謝る、私はCとcgoを使用していないので、私の例はいくつかの説明が必要な場合があります。ガベージコレクションとcgo

あなたが使用したいCライブラリがあり、このライブラリは手動で解放する必要があるメモリを割り当てます。囲碁ランタイムで*スタッフへの参照がないときStuff.Free()を呼び出すためのガベージコレクタのためにどのような方法があります

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 
} 

:私は何をしたいのですが、このようなものでしょうか?

私はここで理にかなっていますか?

より直接的な質問は:ランタイムが、そのオブジェクトへの参照がゼロのときにランタイムが呼び出す関数を記述することによって、ランタイムに自動的に割り当てられたCメモリのクリーンアップを処理させることは可能でしょうか?

答えて

12

runtime.SetFinalizer関数がありますが、Cコードで割り当てられたオブジェクトには使用できません。

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

しかし、あなたは自動的に解放する必要がある各Cオブジェクトの移動オブジェクトを作成することができます

関連する問題