নিচের প্রোগ্রামটি বিবেচনা করুন:
#include <iostream>
using namespace std;
int* Array() {
int a[100]; // লোকাল অ্যারে (স্টকে)
a[0] = 7;
a[1] = 6;
a[2] = 4;
a[3] = 3;
return a; // লোকাল ভ্যারিয়েবলের অ্যাড্রেস রিটার্ন
}
int main() {
int* p = Array();
cout << p[0] << " " << p[1] << " " << p[2] << " " << p[3];
return 0;
}
কম্পাইলার ওয়ার্নিং
In function 'int* Array()': warning: address of local variable 'a' returned [-Wreturn-local-addr] int a[100];
কারণ: ফাংশন Array()-এ a একটি লোকাল ভ্যারিয়েবল (স্টকে অ্যালোকেটেড)। ফাংশন রিটার্ন হলে এর লাইফটাইম শেষ হয়ে যায় এবং মেমরি ডিক্লেয়ার হয়ে যায়। তাই রিটার্ন করা পয়েন্টার ড্যাঙ্গলিং পয়েন্টার হয় — এটি অবৈধ মেমরি পয়েন্ট করে। ডিরেফারেন্স করলে অনডিফাইনড বিহেভিয়র (UB) হয়।
সমাধান:
- ডাইনামিক অ্যালোকেশন:
int* a = new int[100];(কলার দায়delete[]) - std::vector রিটার্ন:
vector<int> Array() { return {7,6,4,3}; }(সেরা প্র্যাকটিস) - std::array রিটার্ন:
array<int, 4> Array() { return {7,6,4,3}; }(ফিক্সড সাইজ) - আউটপুট প্যারামিটার:
void Array(int* out, int n)
C++ ডিজাইনে ফাংশন থেকে লোকাল অ্যারে রিটার্ন করা নিষিদ্ধ কারণ এটি মেমরি সেফটি লঙ্ঘন করে।