2009-02-24 18 views
20

मुझे खेद है कि यह एक स्पष्ट सवाल है, लेकिन न तो Google या यहां एक खोज ने मुझे जवाब दिया।सी # में एक सरणी को कैसे हटाएं?

क्या कोई सरणी पूरी तरह से निकालने का कोई तरीका है?

मैं की विपरीतint[] array = new int[5]

+1

@ShuggyCoUk वैसे मैं वास्तव में एक विश्वविद्यालय पाठ्यक्रम कर रहा हूं और (दुर्भाग्यपूर्ण) रिक्त स्थान भर रहा हूं, मेरे प्रोफेसर हमें उन प्रश्नों के साथ छोड़ देता है जो प्रश्नों के साथ कड़वाहट से ढके नहीं हैं। मुझे लगता है कि प्रश्न पूछने की कला सीखने के लिए और अधिक महत्वपूर्ण है तो उत्तर दें इसलिए मैं पूछता हूं कि मुझे जवाब नहीं मिल रहा है जब मुझे –

+0

का उत्तर डुप्लिकेट नहीं मिलता है [सी # में बड़ी सूची द्वारा उपयोग की जाने वाली मुफ्त मेमोरी कैसे है?] (Http: // stackoverflow.com/questions/17955346/how-free-memory-used-by-a-large-list-in-c) – bigge

+1

@ बिगेज और 200 9 से अधिक प्रश्नोत्तरी के साथ सवाल कितना है और पोस्ट किए गए एक डुप्लिकेट का जवाब यह जुलाई? जीसी को बताने के लिए –

उत्तर

33

आप कॉल कहते हैं:

void Foo(){ 
    int[] a = new int[5]; 
} 

सी # में चर a अपरिभाषित करने के लिए कोई रास्ता नहीं है। इसका मतलब है कि aFoo में परिभाषित किया जाएगा भले ही आप a को शून्य पर सेट करें। हालांकि, Fooa के अंत में दायरे से बाहर हो जाएगा। इसका मतलब है कि कोई भी कोड इसका संदर्भ नहीं दे सकता है, और कचरा कलेक्टर अगली बार आपके लिए स्मृति को मुक्त करने का ख्याल रखेगा, जो लंबे समय तक नहीं हो सकता है।

+3

को निश्चित उत्तरों से प्यार होना चाहिए :) धन्यवाद मुझे गुगलिंग से बचाने के लिए एक गुच्छा। –

+0

मुझे पता है कि यह एक पुराना धागा है, लेकिन मुझे उम्मीद है कि कोई मदद कर सकता है। मैंने प्रबंधित जीसी को देखा है, नेट कोड वास्तव में एक अच्छा काम नहीं करता है जब तक कि एप्लिकेशन बंद नहीं हो जाता है। जब सरणी या ऑब्जेक्ट्स के लिए मेमोरी आवंटन और निपटान बहुत बार और बार-बार होता है, तब भी स्मृति जारी नहीं होती है जब उचित() {} ब्लॉक का उपयोग किया जाता है। मैंने देखा है कि यह टास्क मैनेजर में जोड़ रहा है, जबकि मैं अपनी कुर्सी के किनारे पर बैठा हूं, यह सोचकर कि इसे दुर्घटनाग्रस्त होने से पहले इसे कैसे नियंत्रित किया जाए। क्या यहां कोई अनियंत्रित रहस्य हैं? –

+0

@ प्रदीप पुराणिक, मुझे लगता है कि आपको एक नया प्रश्न पूछने के लिए बेहतर भाग्य होगा। – RossFabricant

16

तुम बस यह क्षेत्र से बाहर जाते हैं, और जीसी यह पता लगाने के लिए के लिए प्रतीक्षा करने देने के लिए करना चाहते हैं; जो तुरंत नहीं हो सकता है (वास्तव में, यह लगभग निश्चित रूप से नहीं होगा)। यदि आपके पास दीर्घकालिक वस्तु (जो कि दायरे में रहने जा रहा है) पर एक फ़ील्ड है, तो आप शून्य पर सेट कर सकते हैं, जो मदद कर सकता है।

आप जीसी को जल्द से जल्द इकट्ठा करने के लिए प्रभावित कर सकते हैं (केवल आपकी वस्तु नहीं: सबकुछ योग्य), लेकिन शायद यदि आपको कभी भी ऐसा करना चाहिए। मैं केवल टेस्ट रिग में इसका उपयोग करता हूं; लेकिन:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); // DON'T DO THIS!!! 
अधिक के लिए

GC.Collect पर:

+3

+1। –

5

, जीसी इसके साथ सौदा होगा सरणी नष्ट करने के लिए कोई जरूरत नहीं है।

(बहुत) Simplistically:

आप स्मृति समाप्त हो जाता है कचरा कलेक्टर में शुरू होगा, अपने कोड रोकने के लिए और स्मृति में सभी को लाइव वस्तुओं बढ़ावा देते हैं।
लाइव का अर्थ स्टैक, एक रजिस्टर, एक स्थिर संदर्भ और कुछ अन्य चीजों पर सामूहिक रूप से 'जीसी रूट' के रूप में जाना जाता है। जैसे ही यह उन्हें घुमाता है, यह नोट करता है कि वे जीवित हैं।

यदि आपकी सरणी अब और नहीं रहती है तो इसका कोई और तरीका नहीं है, जो कि अब तक पहुंच सकता है (यही वह है जो लचीला निर्धारित करता है), इसलिए जिस पर कब्जा कर लिया गया स्मृति पुन: उपयोग के लिए उपलब्ध होगा।

वहाँ मई शून्य पर अगर यह संदर्भ जिंदा लंबे समय तक की तुलना में वांछित है या यह याद है कि आप तुरंत जरूरत है की एक बड़ी हिस्सा रखा है पकड़ होगा संदर्भ आवंटित करने के लिए एक कारण हो सकता है लेकिन यह आसानी से उल्टी और वास्तव में सरणी बना सकते हैं तुम्हारी उम्र लंबी हो। स्टैक वैरिएबल के बजाए इंस्टेंस इस अनुकूलन के लिए बेहतर उम्मीदवार हैं यदि युक्त इंस्टेंस में उस सरणी की तुलना में काफी लंबा जीवन होगा।

स्पष्ट है कि, अभी शुरुआत के रूप में आप बात की इस तरह पर विचार नहीं किया जाना चाहिए, जीसी जाने करना यह काम है और केवल यह मदद करने के लिए जब आप का प्रयास करें:

  1. पता है कि तुम जरूरत के लिए
  2. पता कैसे
  3. आप यह किया सही
3

सरणी = बातिल की जाँच करने के लिए कैसे पता करने के लिए है, लेकिन मुझे लगता है कि अगर आप नेट स्मृति प्रबंधन मॉडल के बारे में थोड़ा पढ़ा पूरी तरह से क्यों समझने के लिए यह एक अच्छा विचार हो जाएगा।

+0

क्या मैं वास्तव में इसके लिए एक डाउनवोट लायक हूं? – Trap

+1

मैंने वोट दिया क्योंकि मुझे नहीं लगता कि आप नीचे वोट के लायक हैं :) – Gautam

+0

अच्छा, धन्यवाद! : डी – Trap

1

आपको जो निकटतम मिलता है वह सिर्फ दायरे से बाहर निकलने या इसे शून्य करने के लिए प्रतीक्षा करने के लिए है।

यह निकाल देंगे नहीं या तुरंत सरणी हटा सकते हैं, लेकिन आप सरणी के सभी संदर्भ ड्रॉप के बाद, कचरा कलेक्टर (जीसी) समय में हटा देंगे ...

3

शायद ज़रुरत पड़े स्पष्ट करने के लिए आपके पास अन्य उत्तरों में व्यक्त की गई शब्दावली में से कुछ को समझ नहीं आया, जीसी कचरा कलेक्टर के लिए खड़ा है। सी # जैसी भाषाएं जिनमें स्वचालित मेमोरी प्रबंधन है, आपको जो करने की आवश्यकता है, उस पर ध्यान केंद्रित करने की अनुमति देता है और आप जो भी बना रहे हैं उसके बारे में चिंता न करें और इसे कब हटाएं। जीसी समय-समय पर आपके द्वारा बनाई गई सभी वस्तुओं के माध्यम से काम करता है और देखता है कि उनके पास कोई संदर्भ है या नहीं। यदि नहीं, तो इसका मतलब है कि आप उनके साथ कुछ भी नहीं कर सकते हैं, इसलिए वे हटाए जा सकते हैं, और सिस्टम बस यही करता है।

अधिक जानकारी के लिए http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) देख

+0

बिल्कुल। सी # सी ++ नहीं है। –

4

आप Chris Brumme's article on the subject पढ़ना चाहिए; पहले कुछ अनुच्छेदों को स्थिति की व्याख्या करनी चाहिए।

और किसी को भी सुझाव है "चर को अशक्त आवंटित" बात यह है कि कहते हैं की विशेष ध्यान देना चाहिए:

यहां तक ​​कि अगर आप जोड़ना "एसी = अशक्त," इसके बारे में अपने उपयोग के बाद, JIT नि: शुल्क है इस असाइनमेंट को मृत कोड होने और इसे खत्म करने पर विचार करने के लिए।

-4

यह हल हो सकता है लेकिन आप सरणी को एक ढेर की तरह इलाज कर सकते हैं। इसके माध्यम से लूप और प्रत्येक पुनरावृत्ति से ऊपर पॉप।

while(true) 
{ 
    if(array.Length==0) 
    { 
     break; 
    } 
    array.Pop(); 
} 

इस तरह से आप बस बिना सरणी में अधिक मूल्यों धक्का कर सकते हैं फिर से दृष्टांत यह

+0

डाउनवोट समझाओ? प्रत्येक बार जब आप मानों को रीसेट करना चाहते हैं तो एक सरणी को पुन: स्थापित करना स्मृति हानि की तरह लगता है – DWolf

-2

सी ++ में नहीं है कुछ भी आप स्मृति से हटाने के लिए चाहते हैं delete कीवर्ड। बेशक आप इसके साथ सरणी को भी हटा सकते हैं, ताकि आप सी ++ में एक फ़ंक्शन लिख सकें जो पैरामीटर के रूप में एक सरणी लेता है, और कार्यान्वयन में आप केवल कोड की एक पंक्ति जोड़ते हैं जो इसे तुरंत हटा देता है। यदि यह फ़ंक्शन क्लास लाइब्रेरी प्रोजेक्ट में किसी क्लास से संबंधित है, तो आप C# में संदर्भ जोड़ सकते हैं, नामस्थान का उपयोग करके इंस्टेंस बना सकते हैं और फ़ंक्शन को कॉल कर सकते हैं, या उदाहरण नहीं बना सकते हैं, अगर फ़ंक्शन को स्थिर घोषित किया गया हो।

तो C++ प्रोजेक्ट प्रकार वर्ग पुस्तकालय है, लेकिन सिर्फ एक dll फ़ाइल नहीं थी, तो आप घोषित समारोह (extern "सी" __declspec (dllexport) और ग में # System.Runtime.InteropServices.DllImport का उपयोग कर इसका इस्तेमाल निर्यात कर लेना चाहिए। जब ​​आप dll आयात का उपयोग , यह महत्वपूर्ण है कि आप डीएलएल फ़ाइल पथ स्ट्रिंग निर्दिष्ट करें, और Convention = CallingConvention पर कॉल करने के बाद। सीडीईसीएल, अगर आप आयातित फ़ंक्शन को कॉल करते समय अपवाद और समस्याएं प्राप्त नहीं करना चाहते हैं।

आप इंटरनेट पर पढ़ सकते हैं यह सब कैसे करें। उम्मीद है कि यह एक अच्छा विचार है।

कोड उदाहरण:

सी ++ dll परियोजना:

extern "C" __declspec(dllexport) void Delete(array<__int32>^ arr) 
{ 
    delete arr; 
} 

सी # परियोजना:

using System; 
using System.Runtime.InteropServices; 
namespace DeleteArray 
{ 
    class Program 
    { 
     [DllImport("...DeleteArray.dll", Convention=CallingConvention)] 
     static extern void Delete(int[] arr); 

     static int Main(string[] args) 
     { 
      int[] array = new int[] { 1, 2, 3, 4, 5 }; 
      foreach (int integer in array) 
      { 
       Console.WriteLine(integer); 
      } 
      Delete(array); 
      Console.Write(array[0]); //Runtime error! 
      return 0; 
     } 
    } 

}

मैं घर पर इस कोशिश की है और यह मेरे लिए बहुत अच्छा काम किया, तो दूसरों को भी क्यों नहीं !?

+0

यह एक उत्तर कैसे है? –

0

यदि आप कथन (इसके बाद) में सरणी चर उपलब्ध नहीं है, तो आप अपने सरणी को if (true) {} कथन में घोषित और प्रारंभ कर सकते हैं, इसलिए इसे हटा दिया जाएगा।

0

सी ++ में कीवर्ड हटा सकते हैं। और मूल रूप से इस टिप्पणी में और अन्य टिप्पणियों में इसका उल्लेख किया गया था। संपादन इतिहास यह दिखाता है। यह एक व्यवहार्य है (यद्यपि साइड उत्तर) भले ही दूसरों को समझ में नहीं आता है। मैं यह इसलिए कहता हूं क्योंकि अगर वे एक से अधिक भाषा समझते हैं, तो कोई इसका अपना सशक्त समाधान ढूंढने के लिए इसका उपयोग कर सकता है।

.NET/MSIL में, आपके पास हटाए गए कीवर्ड हैं, लेकिन इसे variablename कहा जाता है।()। मैं इसे पेश कर रहा हूं क्योंकि यह चर के सभी संदर्भों को हटा देता है, और इसे कचरा संग्रह के लिए तैयारी की स्थिति में धक्का देता है। एक अन्य विकल्प वैरिएबल को शून्य के बराबर सेट करना है क्योंकि यह चर टाइप किए गए ऑब्जेक्ट के रूप में रखेगा, लेकिन इसे कचरा संग्रह में जो भी रखा गया है उसे रिलीज़ करें, ताकि इसे बाद में फिर से सौंप दिया जा सके।

मूल टिप्पणी/उत्तर:

सी # के लिए कचरा संग्रहण महान है और सभी, लेकिन कभी कभी आप वास्तव में स्मृति से एक चर को हटा कर उसे का एक नया उदाहरण बनाने के लिए, अपने कार्यक्रम रखने के किसी अन्य भाग के बिना की जरूरत है यह जीवित है।

aMyArray = new int[]; 

मुख्य समस्या यह है कि मैं के साथ देख सकते हैं: एक, जैसे, स्मृति का एक नया टुकड़ा पर सरणी इंगित करके संभवतः एक जीसी राज्य में सरणी द्वारा आयोजित स्मृति के मौजूदा हिस्सा जगह करने की क्षमता है हालांकि, यह है कि आप वास्तव में स्मृति की एक टन बर्बाद नहीं करना चाहते हैं, और फिर सब कुछ एक डरावना ठहराव के रूप में आ गया है क्योंकि जीसी शुरू हो गया है क्योंकि ओएस मजाक कर रहा है। मैं इस विचार को मानता हूं, क्योंकि सी शार्प अब मुख्यधारा की भाषा है और इसे विभिन्न खेलों में प्रयोग किया जाता है, जिसमें लेखन गेम भी शामिल हैं ... यदि वास्तव में सी शार्प एक्शनस्क्रिप्ट/फ्लैश के समान कार्य नहीं करता तो यह वास्तव में अच्छा होगा। आदर करना।

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