এই কোড স্নিপেট:
int& func1()
{
int i;
i = 1;
return i;
}
কাজ করবে না কারণ আপনি ফাংশন কলের আওতায় সীমাবদ্ধ জীবনব্যাপী কোনও বস্তুর কাছে একটি উপনাম (একটি রেফারেন্স) ফিরিয়ে দিচ্ছেন। তার অর্থ একবারে func1()ফিরে আসে, int iমারা যায়, ফাংশন থেকে ফিরে আসা রেফারেন্সকে অর্থহীন কারণ এটি এখন এমন কোনও বস্তুর উল্লেখ করে যা বিদ্যমান নেই।
int main()
{
int& p = func1();
/* p is garbage */
}
দ্বিতীয় সংস্করণটি কাজ করে কারণ ভেরিয়েবলটি ফ্রি স্টোরে বরাদ্দ করা হয় যা ফাংশন কলটির আজীবন সীমাবদ্ধ নয়। তবে deleteবরাদ্দ দেওয়ার জন্য আপনি দায়বদ্ধ int।
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
}
সাধারণত আপনি কিছু আরএআইআই ক্লাস এবং / অথবা একটি কারখানার ফাংশনে পয়েন্টারটি মোড়ানো করবেন যাতে আপনার deleteনিজের এটি নিজেই না থাকে ।
উভয় ক্ষেত্রেই, আপনি কেবল মূল্যটি নিজেই ফিরিয়ে দিতে পারেন (যদিও আমি উপলব্ধি করেছি যে আপনি যে উদাহরণটি দিয়েছেন তা সম্ভবত অনুমোদিত হয়েছে):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
নোট করুন যে বড় অবজেক্টগুলি একইভাবে func3()আদিম মানগুলি ফেরত দেওয়া পুরোপুরি ঠিক আছে কারণ আজকাল প্রায় প্রতিটি সংকলক রিটার্ন মান অপ্টিমাইজেশনের কিছু ফর্ম প্রয়োগ করে :
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();
}
মজার বিষয় হল, সাময়িকভাবে একটি কনস্ট্যান্ড রেফারেন্সকে বাঁধাই পুরোপুরি আইনী সি ++ ।
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();
}
int& i = * new int;