2012-03-02 5 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()를 호출하는 가비지 컬렉터에 대한 있는가 : 이런 식으로 뭔가 내가 뭘하려는입니까?

여기에 맞는가요?

아마도 더 직접적인 질문입니다 : 런타임에서 해당 객체에 대한 참조가 없을 때 런타임에서 호출하는 함수를 작성하여 런타임에서 자동으로 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 객체의 이동 개체를 만들 수 있습니다