वी 8 के दस्तावेज how to create a Javascript object that wraps a C++ object बताते हैं। जावास्क्रिप्ट ऑब्जेक्ट को एक C++ ऑब्जेक्ट इंस्टेंस में पॉइंटर पर रखा जाता है। मेरा सवाल है, मान लीजिए कि आप ढेर पर सी ++ ऑब्जेक्ट बनाते हैं, जब जावास्क्रिप्ट ऑब्जेक्ट जीसी द्वारा एकत्र किया जाता है, तो आप अधिसूचना कैसे प्राप्त कर सकते हैं, ताकि आप आवंटित सी ++ ऑब्जेक्ट को ढेर कर सकें?जब जावास्क्रिप्ट ऑब्जेक्ट V8 में एकत्र कचरा होता है तो आप एक लपेटा हुआ C++ ऑब्जेक्ट कैसे मुक्त करते हैं?
उत्तर
चाल लिंक्ड करने के लिए 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);
सामान्य रूप से, यदि एक कचरा एकत्रित भाषा भाषा इंजन (फ़ाइलों, सॉकेट, या आपके मामले सी ++ ऑब्जेक्ट्स) के बाहर संसाधनों के संदर्भ रख सकती है, तो आपको उस संसाधन ASAP को रिलीज़ करने के लिए 'बंद' विधि प्रदान करनी चाहिए, जब तक जीसी सोचता है कि यह आपकी वस्तु को नष्ट करने के लिए उपयुक्त नहीं है, तब तक कोई बिंदु इंतजार नहीं कर रहा है।
यदि आपकी सी ++ वस्तु स्मृति-भूख लगी है और कचरा-एकत्रित वस्तु केवल एक संदर्भ है: आप हजारों ऑब्जेक्ट आवंटित कर सकते हैं, और जीसी केवल कुछ केबी की छोटी वस्तुओं को देखता है, संग्रह को ट्रिगर करने के लिए पर्याप्त नहीं है ; जबकि सी ++ पक्ष बालों वाली वस्तुओं के मेगाबाइट के दसियों के साथ संघर्ष कर रहा है।
यही कारण है कि वहाँ समारोह वी 8 :: AdjustAmountOfExternalAllocatedMemory() है ... इस तरह से आप कर सकते हैं वी 8 बताएं कि आपकी वस्तु भूख लगी है ... :-) – nalply
अपने सभी काम को कुछ बंद दायरे (ऑब्जेक्ट या फ़ंक्शन) में करें। फिर जब आप दायरे से बाहर निकलते हैं तो आप सी ++ ऑब्जेक्ट को सुरक्षित रूप से हटा सकते हैं। जीसी पॉइंटर्स की ओर इशारा करते हुए पॉइंटर्स की जांच नहीं करता है। । "Persistent
हैंडल एक ढेर पर आयोजित नहीं कर रहे हैं और केवल नष्ट हो जाती हैं जब आप विशेष रूप से उन्हें हटाने ... एक लगातार हैंडल का उपयोग करें:
- 1. लपेटा हुआ प्रोटोटाइप ऑब्जेक्ट पर अवैध ऑपरेशन
- 2. जब MVAr कचरा एकत्र किया जाता है
- 3. क्या आप जावास्क्रिप्ट में कोई ऑब्जेक्ट बना सकते हैं जो ऑब्जेक्ट से प्राप्त नहीं होता है?
- 4. जब आप GetType() करते हैं तो वास्तव में क्या होता है?
- 5. जब आप कोई प्रोग्राम चलाते हैं तो क्या होता है?
- 6. सी # में, जब आप किसी शून्य ऑब्जेक्ट पर एक्सटेंशन विधि को कॉल करते हैं तो क्या होता है?
- 7. यदि आप कोई ऑब्जेक्ट हटाते हैं तो वास्तव में क्या होता है? (जीसीसी) (जब दुर्घटनाओं डबल हटाना चाहते हैं?)
- 8. जावा में जब कोई ऑब्जेक्ट पहुंच योग्य नहीं होता है?
- 9. क्या होता है जब आप किसी ऑब्जेक्ट का उदाहरण बनाते हैं जिसमें C# में कोई स्थिति नहीं है?
- 10. यदि आप C++ में कोई मान वापस नहीं करते हैं तो क्या होता है?
- 11. गतिविधि का पहला उदाहरण कभी कचरा एकत्र नहीं होता है?
- 12. ऐप क्रैश होता है जब मैं ऑब्जेक्ट
- 13. जब आप एक आईओएस ऐप अपडेट करते हैं, तो दस्तावेज़ फ़ोल्डर सामग्री का क्या होता है?
- 14. आप एक पायथन टाइम.स्ट्रक्चर_टाइम ऑब्जेक्ट को डेटाटाइम ऑब्जेक्ट में कैसे परिवर्तित करते हैं?
- 15. क्या होता है जब आप C++ में दो बार या अधिक पॉइंटर को आवंटित करते हैं?
- 16. जब आप अनुवादित पाठ में लिंक करते हैं तो आप गेटटेक्स्ट का उपयोग कैसे करते हैं?
- 17. ऑब्जेक्टिव-सी वास्तव में क्या करता है जब आप ऑब्जेक्ट घोषित करते हैं?
- 18. आप ऑब्जेक्ट की आंतरिक स्थिति को कैसे सत्यापित करते हैं?
- 19. जावा में, वस्तुओं का एक ऐरे कचरा कैसे एकत्र किया जाता है?
- 20. आप बिटमैपडेटा ऑब्जेक्ट में बिटमैप फ़ाइल कैसे लोड करते हैं?
- 21. पायथन में, जब आप किसी फ़ंक्शन के अंदर आयात करते हैं तो क्या होता है?
- 22. जब आप बैकबोन मॉडल को सहेजते हैं तो वास्तव में क्या होता है?
- 23. जब आप ऐप्पल के आईट्यून्स कनेक्ट में बाइनरी अपलोड करते हैं तो क्या होता है?
- 24. जब आप ब्राउज़र में यूआरएल टाइप करते हैं तो क्या होता है
- 25. जावास्क्रिप्ट में आप स्मृति को कैसे साफ़ करते हैं?
- 26. एक हैंडलर कचरा कैसे/कब एकत्र किया जाता है?
- 27. जावा: जब ऑब्जेक्ट किसी ऑब्जेक्ट पर प्रतीक्षा करता है तो सभी मॉनीटर जारी किए जाते हैं?
- 28. जब आप Toolkit.getDefaultToolkit() को AWTError फेंकते हैं तो आप जावा में एक छवि कैसे पढ़ते हैं?
- 29. जब आप रिमोट ऑब्जेक्ट से .NET Remoting
- 30. यदि आप एक खाली जावा फ़ाइल संकलित करते हैं तो क्या होता है?
स्थानीय
@xaxxon: मैं यह स्वीकार करने वाला पहला व्यक्ति होगा कि मुझे वी 8 जावास्क्रिप्ट इंजन के साथ कोई अनुभव नहीं है (मुझे छह साल पहले प्रलेखन से इस प्रश्न का उत्तर मिल गया था)। मैं ** सोचता हूं ** आपके प्रश्न का उत्तर https://developers.google.com/v8/embed पर उदाहरण है?csw = 1 # गतिशील, लेकिन यह भी संभव है कि आपके पास अपने आप से पूछने के लिए एक प्रश्न हो। –
धन्यवाद। मैंने अंततः इसे समझ लिया। लाइन 1400 के आसपास शुरू होने पर https://code.google.com/p/chromium/codesearch#chromium/src/v8/src/d8.cc&l=1064 – xaxxon