কম্পিউটার টিউটোরিয়াল

C++ কেন ফাংশন থেকে অ্যারে রিটার্ন সাপোর্ট করে না

নিচের প্রোগ্রামটি বিবেচনা করুন:

#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) হয়।

সমাধান:

  1. ডাইনামিক অ্যালোকেশন: int* a = new int[100]; (কলার দায় delete[])
  2. std::vector রিটার্ন: vector<int> Array() { return {7,6,4,3}; } (সেরা প্র্যাকটিস)
  3. std::array রিটার্ন: array<int, 4> Array() { return {7,6,4,3}; } (ফিক্সড সাইজ)
  4. আউটপুট প্যারামিটার: void Array(int* out, int n)

C++ ডিজাইনে ফাংশন থেকে লোকাল অ্যারে রিটার্ন করা নিষিদ্ধ কারণ এটি মেমরি সেফটি লঙ্ঘন করে।

  1. C++-এ malloc() কেন কাস্ট চায় কিন্তু C-এ চায় না?

  2. C++-এ কনস্ট মেম্বার ফাংশন

  3. GCC-এ C++ স্ট্যান্ডার্ড সাপোর্ট (C++ Standards Support in GCC)

  4. কেন Variable-Length Arrays (VLA) C++ স্ট্যান্ডার্ডে নেই?