एक कार्यक्रम में संसाधनों (स्मृति सहित) के प्रबंधन का मूल विचार, जो भी रणनीति है, वह है कि अगम्य "वस्तुओं" से बंधे संसाधनों को पुनः प्राप्त किया जा सकता है। स्मृति से परे, उन संसाधनों में म्यूटेक्स ताले, फ़ाइल हैंडल, सॉकेट, डेटाबेस कनेक्शन हो सकते हैं ...
कूड़े के संग्रह वाली भाषाएं समय-समय पर अप्रयुक्त वस्तुओं को खोजने के लिए मेमोरी (एक ही रास्ता या किसी अन्य) को स्कैन करती हैं, उनसे जुड़े संसाधनों को जारी करती हैं, और अंत में उन वस्तुओं द्वारा उपयोग की जाने वाली मेमोरी को छोड़ देती हैं।
जंग के पास जीसी नहीं है, यह कैसे प्रबंधन करता है?
जंग का स्वामित्व है। एक affine type सिस्टम का उपयोग करते हुए , यह ट्रैक करता है कि कौन सा वैरिएबल अभी भी एक ऑब्जेक्ट पर पकड़ रहा है और, जब ऐसा वैरिएबल स्कोप से बाहर चला जाता है, तो इसके डिस्ट्रक्टर को कॉल करता है। आप एफिन प्रकार की प्रणाली को बहुत आसानी से देख सकते हैं:
fn main() {
let s: String = "Hello, World!".into();
let t = s;
println!("{}", s);
}
पैदावार:
<anon>:4:24: 4:25 error: use of moved value: `s` [E0382]
<anon>:4 println!("{}", s);
<anon>:3:13: 3:14 note: `s` moved here because it has type `collections::string::String`, which is moved by default
<anon>:3 let t = s;
^
जो पूरी तरह से दिखाता है कि भाषा के स्तर पर किसी भी समय, स्वामित्व को ट्रैक किया जाता है।
यह स्वामित्व पुनरावर्ती रूप से काम करता है: यदि आपके पास एक Vec<String>
(यानी, तार का एक गतिशील सरणी) है, तो प्रत्येक String
का स्वामित्व Vec
स्वयं एक चर या किसी अन्य वस्तु, आदि के स्वामित्व में है ... इस प्रकार, जब एक चर दायरे से बाहर हो जाता है, यह अप्रत्यक्ष रूप से आयोजित सभी संसाधनों को पुन: जमा करता है। इस मामले में Vec<String>
इसका मतलब है:
- प्रत्येक से जुड़ी मेमोरी बफर जारी करना
String
- मेमोरी बफ़र को
Vec
स्वयं से संबंधित रिलीज़ करना
इस प्रकार, स्वामित्व ट्रैकिंग के लिए धन्यवाद, सभी कार्यक्रम वस्तुओं का जीवनकाल सख्ती से एक (या कई) फ़ंक्शन चर से बंधा हुआ है, जो अंततः दायरे से बाहर चले जाएंगे (जब ब्लॉक वे समाप्त होते हैं)।
नोट: यह थोड़ा सा आशावादी है, संदर्भ गिनती ( Rc
या Arc
) का उपयोग करके संदर्भों के चक्रों को बनाना संभव है और इस प्रकार मेमोरी लीक का कारण बनता है, जिस स्थिति में चक्र से बंधे संसाधन कभी भी जारी नहीं किए जा सकते हैं।