2012-03-02 34 views
10

Có thể làm cho bộ thu gom rác trong xử lý Go và giải phóng bộ nhớ được cấp phát qua mã C không? Tôi xin lỗi, tôi đã không sử dụng C và cgo trước đây vì vậy ví dụ của tôi có thể cần một số làm rõ.Bộ sưu tập rác và cgo

Giả sử bạn có một số thư viện C mà bạn muốn sử dụng và thư viện này phân bổ một số bộ nhớ cần được giải phóng thủ công. Những gì tôi muốn làm là một cái gì đó như thế này:

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ó cách nào để bộ thu gom rác gọi Stuff.Free() khi không có tham chiếu đến * Nội dung trong thời gian chạy?

Tôi có ý nghĩa ở đây không?

Có lẽ một câu hỏi trực tiếp hơn là: Có thể làm cho thời gian chạy tự động xử lý việc dọn sạch bộ nhớ C được phân bổ bằng cách viết hàm mà thời gian chạy gọi khi không có tham chiếu đến đối tượng đó không?

Trả lời

12

Có chức năng runtime.SetFinalizer nhưng không thể sử dụng trên bất kỳ đối tượng nào được cấp bởi mã C.

Tuy nhiên, bạn có thể tạo một đối tượng Go cho từng đối tượng C mà cần phải được giải phóng tự động:

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ác vấn đề liên quan