2016-05-16 7 views
6

मुझे सी structs और डेटाटाइप के लिए एक सवाल है।सी 0 संरचना की मुक्त स्मृति कब होगी

struct test 
{ 
    char* c; 
    char* c2; 
}; 

और मैं एक समारोह से इस struct लौट रहा:

struct test a() 
{ 
    struct test t = { "yeah!", "string" }; 
    return t; 
} 

मेरा प्रश्न है struct के लिए स्मृति स्वतः मुक्त कर रहा है या मैं यह करने के लिए है अगर मैं एक struct test कहा जाता है मैन्युअल रूप से free() के माध्यम से।

[अद्यतन from comment:]

समारोह एक एक DLL में है और मैं मुख्य कार्यक्रम में struct उपयोग करना चाहते हैं।

+0

पॉइंटर्स को समझने के लिए अच्छी जगह: http://cslibrary.stanford.edu/104/ – Chintan

+3

_Automatically_। किया हुआ। –

+0

आप "मुक्त" से क्या समझते हैं? –

उत्तर

3

टीएल/डीआर संस्करण: आपको मैन्युअल रूप से free कुछ भी करने की आवश्यकता नहीं है; आप इस स्ट्रक्चर उदाहरण का इलाज कर सकते हैं जिस तरह से आप किसी भी स्केलर वैरिएबल का इलाज करेंगे।

थोड़ा लंबा संस्करण: struct उदाहरण t, स्वत: भंडारण अवधि है, जिसका अर्थ है अपने जीवन a समारोह के जीवनकाल में फैली हुई है; एक बार a निकलता है, t के लिए आवंटित कोई भी स्मृति जारी की जाती है। t की सामग्री की प्रतिलिपि कॉलर को वापस कर दी गई है।

उन सामग्री के लिए के रूप में ...

c और c2स्ट्रिंग शाब्दिक ओर इशारा करते हैं; स्ट्रिंग अक्षर आवंटित किए जाते हैं जैसे कि उनका जीवनकाल पूरे कार्यक्रम के निष्पादन पर फैला हुआ है। इसलिए c और c2 में सूचक मान ta से वापस लौटाए जाने के बाद मान्य होंगे; वास्तव में, उन सूचक मूल्य कार्यक्रम के जीवनकाल में मान्य होंगे।

आप केवल कुछ है कि के माध्यम से malloc, calloc, या realloc आवंटित किया गया था पर free कॉल करने के लिए होना चाहिए।

5

आपको केवल free कुछ ऐसा होना चाहिए जो आप malloc एड (या किसी अन्य समान फ़ंक्शन का उपयोग करते हैं) पहले। चूंकि कुछ भी malloc एड था, कुछ भी free डी होना चाहिए।

+1

लेकिन मैं तब तक कितनी देर तक संरचना का उपयोग कर सकता हूं? समारोह 'ए' एक डीएलएल में है और मैं मुख्य कार्यक्रम में संरचना का उपयोग करना चाहता हूं। संकलक को हटाने के लिए संकलक कैसे जानता है? –

+0

कंपाइलर प्रतिलिपि बनाने के लिए मेमकोपी का उपयोग करता है जब आप 'वापसी टी' दुर्भाग्यवश डीएलएल डेटा लौटने के लिए स्ट्रिंग अक्षर ("हाँ!", "स्ट्रिंग") का उपयोग करने का एक भयानक काम कर रहा है। इनमें से जीवनकाल आमतौर पर तब तक होता है जब अधिकांश सिस्टम पर डीएलएल स्मृति में होता है, इसलिए लौटाई गई स्मृति अधिकतर अनुपयोगी होती है। बेहतर समाधान हैप पर आवंटित करना, स्ट्रिंग प्रतिलिपि करना और फिर संरचना को वापस करना है। एक बार जब यह संरचना के साथ किया जाता है तो कॉलर मुफ्त में करें। – Chintan

+0

@ चिंतन ऐसी कोई गारंटी नहीं है। एक स्ट्रक्चर रिटर्न वैल्यू रजिस्ट्रार में भी हो सकता है। –

0

आपको एक गैर गतिशील आवंटन मुक्त करने की आवश्यकता नहीं है। फिर भी, यदि आप किसी अन्य फ़ंक्शन में संरचना का उपयोग करना चाहते हैं, तो आपको स्ट्रक्चर का पता पास करना होगा, और इसे एक (स्ट्रक्चर *) के रूप में लेना होगा, यदि आप नहीं करते हैं, तो आप इसे फिर से उपयोग नहीं कर पाएंगे।

+1

सच नहीं है। नियम (और इस मामले में) मूल्य से गुजर सकते हैं ठीक है। –

+0

मैंने कभी इनकार नहीं किया। तो कृपया कुछ भी नहीं के लिए downvote बंद करो। –

+1

आपका उत्तर स्पष्ट रूप से उस कथन का विरोध करता है। –

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