2012-03-02 15 views
10

क्या गो हैंडल में कचरा कलेक्टर बनाना संभव है और सी कोड के माध्यम से आवंटित स्मृति जारी करना संभव है? मैं क्षमा चाहता हूं, मैंने पहले सी और कागो का उपयोग नहीं किया है, इसलिए मेरे उदाहरणों को कुछ स्पष्टीकरण की आवश्यकता हो सकती है।कचरा संग्रह और कागो

आइए कहें कि आपके पास कुछ सी लाइब्रेरी है जिसका आप उपयोग करना चाहते हैं और यह लाइब्रेरी कुछ मेमोरी आवंटित करती है जिसे मैन्युअल रूप से मुक्त करने की आवश्यकता होती है। कुछ इस तरह मुझे क्या करना चाहते हैं:

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() कॉल करने के लिए जब वहाँ कोई संदर्भ जाओ क्रम में करने के लिए * सामग्री हैं कचरा कलेक्टर के लिए किसी भी तरह से वहाँ है?

क्या मैं यहां समझ रहा हूं?

शायद एक और सीधा सवाल यह है: क्या रनटाइम स्वचालित रूप से सी आवंटित स्मृति की सफाई को उस कार्य को लिखकर संभाल सकता है जब उस ऑब्जेक्ट के शून्य संदर्भ होने पर रनटाइम कॉल करता है?

उत्तर

12

runtime.SetFinalizer फ़ंक्शन मौजूद है, लेकिन इसका उपयोग सी कोड द्वारा आवंटित किसी भी ऑब्जेक्ट पर नहीं किया जा सकता है।

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

हालांकि, आप प्रत्येक सी वस्तु स्वतः मुक्त होने की जरूरत है के लिए एक जाओ वस्तु बना सकते हैं

संबंधित मुद्दे