2012-01-19 11 views
9

हमारे पास सी ++ में पॉइंटर्स की अवधारणा है। अब अगर हम सी ++ में कुछ मेमोरी आवंटित करते हैं और जावा पर ऑब्जेक्ट रेफरेंस (जेएनआई का उपयोग करके) को पास करते हैं तो कौन होना चाहिए और कौन इसे मुक्त कर देगा।जेएनआई, कचरा संग्रह और पॉइंटर्स- जावा/सी ++ जो क्या करना चाहिए?

यह

1. होगा) कचरा कलेक्टर जावा में यह स्वचालित रूप से करता है?

2.) हमें लिपटे जेएनआई कक्षा को अंतिम रूप देने के लिए सूचक पर स्पष्ट रूप से हटाना होगा?

3.) या हम सिर्फ भूल जाते हैं तो अंतिम रूप देने के (के रूप में finalizers भरोसा नहीं किया जा सकता है) और यह जावा की जिम्मेदारी है एक सी ++ कोड जो वस्तु

4.) को हटा देता है या वहां किसी तरह पुनःआवंटन है कॉल करने के लिए सीधे जावा में मेमोरी (सुनिश्चित नहीं है कि जावा इसे हटाने के लिए सी ++ पॉइंटर इनऑर्डर को कैसे छेड़छाड़ करता है)?

ऐसा करने के लिए सबसे अच्छा अभ्यास क्या है और इसके विपरीत (जब हम जावा से सी ++ ऑब्जेक्ट पास करते हैं)?

उत्तर

8

हमारे पास सी ++ में पॉइंटर्स की अवधारणा है। अब अगर हम सी ++ में कुछ मेमोरी आवंटित करते हैं और जावा पर ऑब्जेक्ट रेफरेंस (जेएनआई का उपयोग करके) को पास करते हैं तो कौन होना चाहिए और कौन इसे मुक्त कर देगा।

सबसे अच्छी रणनीति आम तौर पर डेटा को मुक्त करने के लिए आवंटक होने वाला होता है।

1.) कचरा कलेक्टर जावा में स्वचालित रूप से करता है?

इस समस्या के साथ आप यह नहीं जानते कि कभी कब चलेंगे।

2.) हमें लिपटे जेएनआई कक्षा को अंतिम रूप देने के तरीके में सूचक पर स्पष्ट रूप से हटाना होगा?

जावा में रिलीज() विधि को बेहतर करने के बजाय बेहतर है कि C++ को इसे हटाना होगा। आप स्मृति को रीसायकल करने के लिए सी ++ चाहते हैं।

3.) या हम सिर्फ भूल जाते हैं तो अंतिम रूप देने के (के रूप में finalizers भरोसा नहीं किया जा सकता है) और यह जावा की जिम्मेदारी है एक सी ++ कोड जो वस्तु

यदि आप मतलब है, स्मृति को आबंटित हटाता कॉल करने के लिए जावा में और इसे पॉप्युलेट करने के लिए C++ पर पास करें। यह मेरी वरीयता है।

मैं उपयोग करूँगा ByteBuffer.allocateDirect() का उपयोग कर सकते हैं और आप इसे निर्धारित करने के लिए ((DirectBuffer) buffer).cleaner().clean(); पर कॉल कर सकते हैं।

यह स्मृति को रीसाइक्लिंग को सरल बना सकता है, संभवतः उसी बफर को एप्लिकेशन के जीवन के लिए उपयोग किया जा सकता है।

+0

+1 निश्चित रूप से आवंटक रिलीज करने वाला एक होना चाहिए, और जावा-साइड आवंटित करना (यदि संभव हो) "क्लीनर" है। – Viruzzo

+0

मैं अपने क्लीनर से सहमत हूं, esp अगर जावा सी ++ को अन्य तरीकों से बजाए। –

+0

बिंदु संख्या 2 के लिए, जावा में रिलीज विधि C++ विधि को कॉल करेगी जो वास्तव में ऑब्जेक्ट को हटा देगी? जावा सीधे सी ++ में आवंटित स्मृति को कैसे जारी कर सकता है? – seahorse