2012-03-02 146 views
10

是否有可能在Go處理中創建垃圾收集器並釋放通過C代碼分配的內存?我很抱歉,我之前沒有使用C和cgo,所以我的示例可能需要一些說明。垃圾回收和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運行時?

我在這裏有意義嗎?

也許一個更直接的問題是:是否可以通過編寫一個函數來使運行時自動處理清理C分配的內存,該函數在對該對象有零引用時運行時調用?

回答

12

存在runtime.SetFinalizer函數,但它不能用於由C代碼分配的任何對象。

但是,你可以爲每個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) 
}