Sunday 15 January 2012

c++ - Do I need to use a temporary value for this assignment? -


मुझे निम्नलिखित कोड वाले कोड में विरासत मिली:

  TStringList * pPortList (NULL); PPortList = FindCommPorts (); कनेक्शनडिलाओग- & gt; पोर्टललास्ट = pPortList; Int nModalReturn = ConnectionDialog- & gt; शोमोल्ड (); PPortList हटाएं;   

FindCommPorts () एक ऐसा कार्य है जो एक नया TStringList () बनाता है, इसे पॉप्युलेट करता है, और उसे वापस देता है।

मुझे इस के साथ कोड बदलने की परीक्षा थी:

  कनेक्शनडिलाओग-> पोर्टलिस्ट = खोजसंचार (); Int nModalReturn = ConnectionDialog- & gt; शोमोल्ड ();   

लेकिन फिर मुझे एहसास हुआ कि मैं सी ++ के स्वामित्व शब्दों के साथ पर्याप्त परिचित नहीं हूं ताकि इस बारे में सुनिश्चित हो। क्या यह रिसाव मेमोरी होगी क्योंकि FindCommPorts () के परिणाम को हटाएं d?

संपादित करें: कोड के माध्यम से खोजना फिर से, मुझे नहीं लगता है कि मूल संस्करण को फांसी के सूचक में मिला - यह पता चला है कि ConnectionDialog-> PortList वास्तव में एक संपत्ति है (मैं Borland C ++ Builder 6 का उपयोग कर रहा हूँ) । इस प्रॉपर्टी में एक कस्टम सेटर है जो स्ट्रिंग्स को TStringList से बाहर निकालता है, और उसके बाद पास किए गए पॉइंटर का उपयोग नहीं किया जाता है मैं इस बारे में पहले उल्लेख नहीं करने के लिए माफी चाहता हूं - जिस तरह से कोड लिखा गया था, वह निश्चित रूप से खराब था।

अगर यह कभी भी हटाएं नहीं होता है, तो हाँ, आप स्मृति को रिसाव करेंगे। हालांकि, आपके पास इस कोड के साथ समस्या भी बदतर है इस तरह से अपनी स्थिति पर विचार करें:

  • FindCommPorts () एक सूचक देता है
  • आप ConnectionDialog-> PortList उसी स्मृति को इंगित करने के लिए कि FindCommPorts () परिणाम की ओर इशारा किया गया।
  • तब आप हटाएं वस्तु पर मौजूद स्मृति को pPortList < / Code> को इंगित करता है, जो कि स्मृति के समान है ConnectionDialog-> PortList !

    इसके बाद, हटाए गए स्मृति के लिए पोर्टलिस्ट चर अंक, और आपको इसे एक्सेस नहीं करना चाहिए। यदि आपको कभी भी इस संकेतक को फिर से उपयोग करने की जरूरत पड़ेगी, तो आपको इसे वैसे भी हटाया नहीं जाना चाहिए, इसलिए आपको FindCommPorts () के सीधे को ConnectionDialog-> के परिणाम को निर्दिष्ट करने के बारे में चिंता करने की ज़रूरत नहीं है। ; PortList । जब आप इसे पूरा कर लें तो इसे हटा दें।

    यदि आपको उस पॉइंटर को हमेशा के लिए मान्य होने की आवश्यकता होगी, तो यह स्थिति स्मृति रिसाव नहीं है क्योंकि डेटा की आवश्यकता है। उस स्थिति में, प्रोग्राम को समाप्त होने पर स्मृति मुक्त हो जाएगी।

    संपादित करें

    आपके प्रश्न को संपादित करने के बाद, मुझे पता है कि आप सही हैं । स्मृति रिसाव को रोकने के लिए आपको अस्थायी चर की आवश्यकता है। यदि आप ऐसा नहीं करते हैं, तो संपत्ति के सेटर ऑब्जेक्ट की प्रतिलिपि को संकेतक द्वारा FindCommPorts () द्वारा वापस लाएगा, और फिर मेमोरी आवंटित की जाएगी, लेकिन कोई चर के साथ नहीं सूचक यह इंगित करते हुए। इस स्थिति में, आपको अस्थायी चर बनाने का अधिकार है, और फिर असाइनमेंट करने के बाद इसे हटाने के लिए।

No comments:

Post a Comment