2011-01-22 14 views
5

आवंटित बहुत सारी वस्तुओं के साथ त्वरित सी बाहर निकलने के लिए मैं एक सी ++ से बाहर निकलने का एक तरीका ढूंढ रहा हूं जिसने सी ++ कक्षाओं का उपयोग करके स्मृति में कई संरचनाओं को आवंटित किया है। कार्यक्रम सही ढंग से खत्म हो जाता है, लेकिन कार्यक्रम में अंतिम "वापसी" के बाद, सभी ऑटो-डिस्ट्रक्टर्स लात मारते हैं। समस्या यह है कि प्रोग्राम ने सी ++ वर्ग संरचनाओं के माध्यम से लगभग 15 जीबी मेमोरी आवंटित की है, और यह स्वत: विनाश प्रक्रिया लेती है लगभग 1 घंटे तक पूरा होने के लिए यह सभी संरचनाओं के माध्यम से चलता है - भले ही मुझे परिणामों की परवाह नहीं है। कार्यक्रम को इस बिंदु तक कार्य को पूरा करने में केवल 1 घंटा लग गए। मैं सिर्फ ओएस पर लौटना चाहता हूं और इसे अपनी सामान्य थोक प्रक्रिया आवंटन हटाना चाहता हूं - जो बहुत तेज़ है। मैं क्लीनअप चरण के दौरान प्रक्रिया को मैन्युअल रूप से मार कर ऐसा कर रहा हूं - लेकिन एक बेहतर प्रोग्रामिक समाधान की तलाश में हूं।सी ++ से त्वरित सफल निकास

मैं ओएस में सफलता वापस करना चाहता हूं, लेकिन मेमोरी सामग्री को रखने की परवाह नहीं करता हूं। कार्यक्रम सामान्य प्रसंस्करण के दौरान बहुत गतिशील आवंटन/डीलोकेशन करता है, इसलिए यह केवल सरल ढेर प्रबंधन नहीं है।

कोई राय?

+6

यदि आप विनाशक में कुछ भी नहीं कर रहे हैं तो यह केवल एक घंटा नहीं ले सकता है। ऐसा कुछ होना चाहिए जो इसे अवरुद्ध कर रहा हो। क्या आपने इसे प्रोफाइल करने की कोशिश की है? – Naveen

उत्तर

1

यदि 15 जीबी मेमोरी को कक्षाओं की एक छोटी संख्या में आवंटित किया जा रहा है, तो आप उन वर्गों के लिए ऑपरेटर को ओवरराइड कर सकते हैं। बस मानक डिलीट पर कॉल पास करें, लेकिन एक वैश्विक ध्वज सेट करें, यदि सेट किया गया है, तो कॉल को नो-ऑप हटाने के लिए कॉल कर देगा। या, यदि आपके प्रोग्राम का तर्क ऐसा है कि इन वस्तुओं को आपके डेटा संरचनाओं के निर्माण के सामान्य पाठ्यक्रम में हटाया नहीं गया है, तो आप इन वर्गों के लिए सभी मामलों में हटाए जाने को अनदेखा कर सकते हैं।

1

जैसा कि नवीन कहते हैं, यह स्मृति विलोपन की बात नहीं हो सकता है। मैंने विकासवादी एल्गोरिदम के साथ तंत्रिका नेटवर्क सिमुलेशन लिखे हैं, जहां छोटे और बड़े हिस्सों में बहुत सारी स्मृति आवंटित और मुक्त की गई थी और यह कभी भी एक प्रमुख मुद्दा नहीं था।

4

मानक सी ++ में आपके पास केवल abort() है, लेकिन इसमें ओएस के लिए प्रक्रिया में विफलता विफलता है।

कई प्लेटफ़ॉर्म (यूनिक्स, एमएस विंडोज) पर आप क्लीनअप और विनाशकों को चलाने के बिना प्रोग्राम से बाहर निकलने के लिए _exit() का उपयोग कर सकते हैं।

+0

_exit() विनाशकों के बारे में कुछ भी नहीं कहता है क्योंकि यह POSIX फ़ंक्शन है (जो सी ++ के बारे में कुछ भी नहीं बताता है)। वर्तमान में यह मेरे पास प्लेटफार्म पर किसी भी विनाशक को नहीं बुलाता है, लेकिन यह दस्तावेज़ीकरण द्वारा गारंटी नहीं है। –

+0

यही कारण है कि मैंने कहा कि यह विशिष्ट प्लेटफॉर्म पर काम करता है। लेकिन जैसा कि http://stackoverflow.com/q/4769229/585729 पर चर्चा की गई है, यह किसी भी मंच पर मौजूद होना चाहिए जहां यह मौजूद है। – JoergB

1

यदि आपके पास सी 99 कंपाइलर है, तो आप _Exit फ़ंक्शन का उपयोग वैश्विक ऑब्जेक्ट विनाशकों या atexit के साथ पंजीकृत किसी भी फ़ंक्शन के बिना तुरंत समाप्त होने के लिए कर सकते हैं; चाहे अनचाहे buffered फ़ाइल डेटा फ़्लश किया गया हो या नहीं, खुली धाराएं बंद हैं, या अस्थायी फ़ाइलों को हटाया गया है कार्यान्वयन-परिभाषित (सी 99 §7.20.4.4) है।

यदि आप विंडोज पर हैं, तो आप उसी प्रभाव को प्राप्त करने के लिए ExitProcess का भी उपयोग कर सकते हैं।

लेकिन, जैसा कि अन्य ने कहा है, आपके विनाशकों को वास्तव में एक घंटे तक नहीं चलना चाहिए जबतक कि आप उचित मात्रा में I/O (लेखन फाइलें इत्यादि) नहीं कर रहे हैं। मैं दृढ़ता से दृढ़ता से अनुशंसा करता हूं कि आप अपने कार्यक्रम को प्रोफ़ाइल देखें कि समय कहां बिताया गया है।

1

संभावित रणनीतियां उन वस्तुओं की संख्या पर निर्भर करती हैं जो सीधे main में दिखाई देती हैं जिसके माध्यम से आप 15 जीबी डेटा तक पहुंचते हैं और यदि ये मुख्य या स्थैतिक रूप से आवंटित हैं।

तो डेटा की 15GB करने के लिए सभी पहुँच main में स्थानीय वस्तुओं के माध्यम से है, तो आप बस return 0;exit(0); साथ main के अंत में जगह ले सकता है।
exit आपके एप्लिकेशन को समाप्त कर देगा और स्थैतिक रूप से आवंटित चर के सफाई को ट्रिगर करेगा, लेकिन स्थानीय चर के नहीं।

यदि डेटा को कुछ हद तक स्थिर आवंटित चर के माध्यम से एक्सेस किया जाता है, तो आप उन्हें गतिशील आवंटित स्मृति के लिए पॉइंटर्स (या संदर्भ) में बदल सकते हैं और जानबूझकर इसे रिसाव कर सकते हैं।

2

सी ++ 0x std::quick_exit वह है जो आप ढूंढ रहे हैं यदि आपका कंपाइलर पहले से ही इसका समर्थन करता है (g ++ - 4.4.5 करता है)।