2011-04-05 36 views
6

सी ++ प्रोग्राम new_handler() को परिभाषित और सेट कर सकते हैं जिन्हें मेमोरी आवंटन कार्यों जैसे operator new() से बुलाया जाना चाहिए यदि अनुरोध की गई स्मृति आवंटित करना असंभव है।कचरा संग्रह के अलावा सी ++ में "new_handler" का उपयोग क्या किया जा सकता है?

कस्टम new_handler() का एक उपयोग dealing with C++ implementations that don't throw an exception on allocation failure है। एक और उपयोग कचरा संग्रह को लागू करने वाले सिस्टम पर कचरा संग्रह शुरू कर रहा है।

कस्टम new_handler() के अन्य उपयोग क्या हैं?

उत्तर

7

कचरा संग्रहण आवेदन के समान हीन में, आप किसी भी कैश किए गए डेटा को मुक्त करने के लिए नए हैंडलर का उपयोग कर सकते हैं।

कहें कि आप डिस्क से पढ़ने वाले कुछ संसाधन डेटा या कुछ गणना के मध्यवर्ती परिणामों को कैशिंग कर रहे हैं। यह वह डेटा है जिसे आप किसी भी समय पुनर्निर्मित कर सकते हैं, इसलिए जब नया हैंडलर कॉल हो जाता है (संकेत मिलता है कि आप ढेर से बाहर हो गए हैं), तो आप कैश किए गए डेटा के लिए मेमोरी को मुक्त कर सकते हैं, फिर नए हैंडलर से वापस आ सकते हैं। उम्मीद है कि new अब आवंटन करने में सक्षम होंगे।

कई मामलों में, वर्चुअल मेमोरी एक ही उद्देश्य की सेवा कर सकती है: यदि आप पर्याप्त रूप से वर्चुअल एड्रेस स्पेस प्राप्त कर चुके हैं तो आप अपने कैश किए गए डेटा को डिस्क पर बदल सकते हैं। 32-बिट सिस्टम पर, यह वास्तव में अब और मामला नहीं है, इसलिए नया हैंडलर एक दिलचस्प विकल्प है। कई एम्बेडेड सिस्टम समान बाधाओं का सामना करेंगे।

6

सर्वर मैं पर काम किया है के सबसे पर, new_handler संदेश (लकड़हारा इस्तेमाल किया गतिशील स्मृति) प्रवेश कर और निरस्त मुक्त कर दिया एक पूर्व आवंटित ब्लॉक (ताकि भविष्य नई के असफल नहीं होगा) से पहले। यह सुनिश्चित करता है कि मेमोरी त्रुटि से बाहर (प्रक्रिया के बजाय बस "गायब हो रहा है" त्रुटि के साथ संदेश cerr पर संदेश, जो /dev/null से जुड़ा था)।

संपादकों, आदि जैसे अनुप्रयोगों में, डिस्क पर कुछ बफर के हिस्सों को फैलाना संभव हो सकता है, फिर जारी रखें; यदि new_handler रिटर्न, ऑपरेटर को आवंटन को फिर से प्रयास करना है, और यदि new_handler ने पर्याप्त मेमोरी को मुक्त कर दिया है, आवंटन सफल हो सकता है (और यदि ऐसा नहीं होता है, तो नया_handler फिर से कॉल किया जाएगा, शायद मुफ्त में और भी ऊपर)।

1

मैंने इसे कभी भी किसी भी चीज़ के लिए उपयोग नहीं किया है - बहुत से ओएस वर्चुअल मेमोरी और एसआईजीएसईजीवी या इसी तरह के समान प्रदान करेंगे यदि वे इसे बाद में प्रदान नहीं कर सकते हैं, तो यह एक अच्छा विचार नहीं है जो मेमोरी-थकाऊ सहिष्णु होने पर निर्भर करता है : यह अक्सर सी ++ के हाथों के बाहर होता है। फिर भी, यदि आपने एक ऐसे सिस्टम के लिए विकसित किया है जहां पर निर्भर किया जा सकता है, तो मैं आसानी से ऐसी परिस्थिति की कल्पना कर सकता हूं जहां आपकी प्रक्रिया में कुछ वास्तविक समय डेटा कतार में स्ट्रीम किया जा रहा था, और आप इसे संसाधित कर रहे थे और परिणाम लिख रहे थे जितना तेज़ हो सके (उदाहरण के लिए डिस्क/नेटवर्क पर रीकंप्रेशन के लिए वीडियो हार्डवेयर स्ट्रीमिंग वीडियो)। यदि आप उस मंच पर पहुंच गए जहां आप और अधिक स्टोर नहीं कर सके, तो आपको बस कुछ छोड़ना होगा, लेकिन यह कब पता चलेगा कि यह बुरा कब हुआ? मनमाने ढंग से सीमा निर्धारित करना मूर्खतापूर्ण होगा, खासकर यदि आपका सॉफ़्टवेयर एक एम्बेडेड वातावरण/बॉक्स के लिए था जो केवल इस कार्य को करने के लिए मौजूद था। और, आपको शायद इस तरह के किसी फ़ंक्शन का उपयोग किसी भी प्रकार की हार्ड-डिस्क आधारित स्वैप मेमोरी के साथ नहीं करना चाहिए, जैसे कि आप पहले ही स्वैप में हैं, आप थ्रूपुट दर के बाद कभी भी दुखी होंगे। लेकिन - चेतावनी के पीछे - जब तक आप पकड़ नहीं लेते हैं, तब तक पैकेट को छोड़ना उपयोगी हो सकता है। कतारबद्ध बफर के माध्यम से शायद हर एनएच फ्रेम को छोड़ना कतार के पीछे या मोर्चे पर एक खंड को छोड़ने से कम दिखाई देगा। जो भी हो, कतार से डेटा को हटाने से इस तरह के कुछ के लिए एक सायन अनुप्रयोग-स्तर का उपयोग (इंट्रा-मेमोरी-सबसिस्टम से अलग) हो सकता है ....

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