2008-10-06 12 views
23

वी 8 के दस्तावेज how to create a Javascript object that wraps a C++ object बताते हैं। जावास्क्रिप्ट ऑब्जेक्ट को एक C++ ऑब्जेक्ट इंस्टेंस में पॉइंटर पर रखा जाता है। मेरा सवाल है, मान लीजिए कि आप ढेर पर सी ++ ऑब्जेक्ट बनाते हैं, जब जावास्क्रिप्ट ऑब्जेक्ट जीसी द्वारा एकत्र किया जाता है, तो आप अधिसूचना कैसे प्राप्त कर सकते हैं, ताकि आप आवंटित सी ++ ऑब्जेक्ट को ढेर कर सकें?जब जावास्क्रिप्ट ऑब्जेक्ट V8 में एकत्र कचरा होता है तो आप एक लपेटा हुआ C++ ऑब्जेक्ट कैसे मुक्त करते हैं?

उत्तर

22

चाल लिंक्ड करने के लिए API संदर्भ से एक Persistent हैंडल (दूसरी बुलेट बिंदु बनाने के लिए है जब आपको एक से अधिक फ़ंक्शन कॉल के लिए ऑब्जेक्ट का संदर्भ रखने की आवश्यकता होती है, या लाइफटाइम को संभालने पर C++ स्कॉप्स के अनुरूप नहीं होता है। "), और उस पर कॉलबैक फ़ंक्शन को पास करने वाले कॉलबैक फ़ंक्शन को पास करने के लिए MakeWeak() पर कॉल करें (" ए कचरा कलेक्टर से कॉलबैक ट्रिगर करने के लिए Persistent::MakeWeak का उपयोग करके लगातार संभाल को कमजोर बनाया जा सकता है, जब किसी ऑब्जेक्ट का एकमात्र संदर्भ कमजोर लगातार हैंडल से होता है। "- यानी, जब सभी" नियमित "हैंडल गुंजाइश से बाहर हो जाते हैं और कब कचरा कलेक्टर वस्तु को हटाने के बारे में है)।

Persistent::MakeWeak विधि हस्ताक्षर है:

void MakeWeak(void* parameters, WeakReferenceCallback callback); 

कहाँ WeakReferenceCallback एक सूचक करने वाली समारोह दो पैरामीटर लेने के रूप में परिभाषित किया गया है:

typedef void (*WeakReferenceCallback)(Persistent<Object> object, 
             void* parameter); 

ये v8.h हैडर वितरित फाइल में पाए जाते हैं सार्वजनिक एपीआई के रूप में वी 8 के साथ।

आप पर Persistent<Object> ऑब्जेक्ट पैरामीटर को साफ़ करने के लिए इच्छित फ़ंक्शन चाहते हैं जो इसे कॉलबैक के रूप में बुलाया जाएगा। void* parameter पैरामीटर अनदेखा किया जा सकता है (या void* parameter एक सी ++ संरचना है कि वस्तुओं कि सफाई की जरूरत रखती को इंगित कर सकते हैं):

void CleanupV8Point(Persistent<Object> object, void*) 
{ 
    // do whatever cleanup on object that you're looking for 
    object.destroyCppObjects(); 
} 

Parameter<ObjectTemplate> my_obj(ObjectTemplate::New()); 

// when the Javascript part of my_obj is about to be collected 
// we'll have V8 call CleanupV8Point(my_obj) 
my_obj.MakeWeak(NULL, &CleanupV8Point); 
+0

स्थानीय के लिए आप इसे कैसे करते हैं? मैं इसे अपने कन्स्ट्रक्टर फंक्शन टेम्पलेट के भीतर से करने की कोशिश कर रहा हूं। मैं एक वाक्यविन्यास नहीं समझ सकता जो मुझ पर चिल्लाता नहीं है। कोशिश की .मेकवेक लेकिन यह अस्तित्व में नहीं है, लगातार :: नया प्रयास किया, लेकिन यह मेरी वस्तु के लिए एक सूचक चाहता था और मेरा कंपाइलर मुझे स्थानीय ऑब्जेक्ट में पॉइंटर बनाने नहीं देगा। – xaxxon

+0

@xaxxon: मैं यह स्वीकार करने वाला पहला व्यक्ति होगा कि मुझे वी 8 जावास्क्रिप्ट इंजन के साथ कोई अनुभव नहीं है (मुझे छह साल पहले प्रलेखन से इस प्रश्न का उत्तर मिल गया था)। मैं ** सोचता हूं ** आपके प्रश्न का उत्तर https://developers.google.com/v8/embed पर उदाहरण है?csw = 1 # गतिशील, लेकिन यह भी संभव है कि आपके पास अपने आप से पूछने के लिए एक प्रश्न हो। –

+0

धन्यवाद। मैंने अंततः इसे समझ लिया। लाइन 1400 के आसपास शुरू होने पर https://code.google.com/p/chromium/codesearch#chromium/src/v8/src/d8.cc&l=1064 – xaxxon

0

सामान्य रूप से, यदि एक कचरा एकत्रित भाषा भाषा इंजन (फ़ाइलों, सॉकेट, या आपके मामले सी ++ ऑब्जेक्ट्स) के बाहर संसाधनों के संदर्भ रख सकती है, तो आपको उस संसाधन ASAP को रिलीज़ करने के लिए 'बंद' विधि प्रदान करनी चाहिए, जब तक जीसी सोचता है कि यह आपकी वस्तु को नष्ट करने के लिए उपयुक्त नहीं है, तब तक कोई बिंदु इंतजार नहीं कर रहा है।

यदि आपकी सी ++ वस्तु स्मृति-भूख लगी है और कचरा-एकत्रित वस्तु केवल एक संदर्भ है: आप हजारों ऑब्जेक्ट आवंटित कर सकते हैं, और जीसी केवल कुछ केबी की छोटी वस्तुओं को देखता है, संग्रह को ट्रिगर करने के लिए पर्याप्त नहीं है ; जबकि सी ++ पक्ष बालों वाली वस्तुओं के मेगाबाइट के दसियों के साथ संघर्ष कर रहा है।

+2

यही कारण है कि वहाँ समारोह वी 8 :: AdjustAmountOfExternalAllocatedMemory() है ... इस तरह से आप कर सकते हैं वी 8 बताएं कि आपकी वस्तु भूख लगी है ... :-) – nalply

0

अपने सभी काम को कुछ बंद दायरे (ऑब्जेक्ट या फ़ंक्शन) में करें। फिर जब आप दायरे से बाहर निकलते हैं तो आप सी ++ ऑब्जेक्ट को सुरक्षित रूप से हटा सकते हैं। जीसी पॉइंटर्स की ओर इशारा करते हुए पॉइंटर्स की जांच नहीं करता है। । "Persistent हैंडल एक ढेर पर आयोजित नहीं कर रहे हैं और केवल नष्ट हो जाती हैं जब आप विशेष रूप से उन्हें हटाने ... एक लगातार हैंडल का उपयोग करें:

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

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