इस सी को देखते हुए ++ कोड:JNA स्मृति रिसाव
void LoadData(char** myVar)
{
std:: string str("[Really Long String Here]");
unsigned int size = str.length() + 1;
*myVar = new char[size];
strncpy(*myVar, str.c_str(), size);
}
और यह JNA जावा:
Pointer myVar = new Memory(Pointer.SIZE);
this.Lib.LoadData(myVar);
this.someVar = myVar.getPointer(0).getString(0);
मैं मेमोरी लीक हो रही है, के रूप में मैं इसे समझ, getPointer (0) एक सूचक बनाना चाहिए ऑब्जेक्ट जिसे अंतिम रूप देने पर जारी किया जाना चाहिए(), लेकिन ऐसा नहीं लगता है।
क्या मुझे कुछ याद आ रही है? यह spec के लिए लगता है ... और मैं उपरोक्त समारोह को C++ ठीक में कोई रिसाव के साथ चला सकते हैं।
मैं जावा कोड को रिसाव का परीक्षण करने के लिए एक लूप में कॉल करता हूं, मैंने विराम डालने का प्रयास किया है, और मैन्युअल रूप से जीसी को कॉल करने का प्रयास किया है, यह भी इस तरह से जल्दी से गीगाबाइट्स पर फूट जाएगा।
मैं कुछ दिनों के लिए इसके खिलाफ अपने सिर को टक्कर लगी हूं और यह मुफ्त मेमोरी के प्रयास के रूप में कुछ छोटे से लापरवाही करने के लिए बेकार है। जहाँ तक मैं कह सकता हूं कि मैं केवल जावा में मैन्युअल रूप से मुक्त स्मृति कर सकता हूं मेरे पास पता है, लेकिन मैं नहीं देख सकता कि मैं इसे कैसे प्राप्त करूंगा।
संपादित करें:
कोई बात नहीं, मैं भी नहीं लगता कि यह विस्तार के बिना JNA के माध्यम से मैन्युअल मुक्त करने के लिए एक तरीका है कि ...
यह अब तक काम करता प्रतीत होता है, लेकिन क्या डेटा मुक्त करने के लिए जेएनए में वास्तव में कोई अन्य तरीका नहीं है? :( – StrangeWill
जेएनए एक मूल पुस्तकालय के लिए सिर्फ एक आवरण है। यह मूल स्मृति का प्रबंधन नहीं करता है, विशेष रूप से प्रत्यक्ष देशी बफर। यह मूल पुस्तकालय डिजाइनर का कार्य है जो पुस्तकालय के उपयोग की स्मृति को आवंटित/डिलीकेट करने के लिए इंटरफेस प्रदान करता है। – ecle
जेएनए के पास है स्मृति को मुक्त करने के लिए आंतरिक तरीकों, बस अजीब है कि मुझे इसे फिर से कार्यान्वित करना होगा क्योंकि यह सब जेएनए में संरक्षित है। – StrangeWill