यह कोड स्निपेट:
int& func1()
{
int i;
i = 1;
return i;
}
क्योंकि आप एक जीवन भर के समारोह कॉल के दायरे तक ही सीमित के साथ एक वस्तु के लिए एक उपनाम (एक संदर्भ) लौट रहे हैं काम नहीं करेगा। इसका मतलब है कि एक बार func1()
रिटर्न, int i
मर जाता है, संदर्भ को निष्पादन से वापस लौटाया गया क्योंकि यह अब किसी ऑब्जेक्ट को संदर्भित करता है जो मौजूद नहीं है।
int main()
{
int& p = func1();
/* p is garbage */
}
दूसरे संस्करण क्योंकि चर मुक्त दुकान है, जो समारोह कॉल के जीवनकाल के लिए बाध्य नहीं है पर आवंटित किया जाता है काम करता है। हालांकि, आप आवंटित int
में delete
के लिए ज़िम्मेदार हैं।
int* func2()
{
int* p;
p = new int;
*p = 1;
return p;
}
int main()
{
int* p = func2();
/* pointee still exists */
delete p; // get rid of it
}
आमतौर पर आप कुछ RAII वर्ग और/या एक कारखाने समारोह में सूचक लपेट ताकि आप इसे अपने आप को delete
की जरूरत नहीं है जाएगा।
या तो मामले में, तुम बस मूल्य में ही लौट सकते हैं (हालांकि मैं उदाहरण आपके द्वारा दी गई एहसास शायद काल्पनिक था):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
ध्यान दें कि यह बड़ा वस्तुओं उसी तरह func3()
रिटर्न आदिम वापस जाने के लिए पूरी तरह से ठीक है मूल्यों क्योंकि लगभग हर संकलक आजकल return value optimization के कुछ फार्म लागू करता है:
class big_object
{
public:
big_object(/* constructor arguments */);
~big_object();
big_object(const big_object& rhs);
big_object& operator=(const big_object& rhs);
/* public methods */
private:
/* data members */
};
big_object func4()
{
return big_object(/* constructor arguments */);
}
int main()
{
// no copy is actually made, if your compiler supports RVO
big_object o = func4();
}
दिलचस्प है, एक स्थिरांक रेफरी के लिए एक अस्थायी बंधन ईरेंस perfectly legal C++ है।
int main()
{
// This works! The returned temporary will last as long as the reference exists
const big_object& o = func4();
// This does *not* work! It's not legal C++ because reference is not const.
// big_object& o = func4();
}
स्रोत
2011-01-10 04:38:55
यह सही नहीं है। –
यदि आप गतिशील आवंटित स्मृति का उपयोग करने के लिए func1() को बदलते हैं तो वे समान हैं :-) 'int & i = * new int;' –
@ मार्टिन इसे कौन हटा देगा? – balki