new অপারেটর ডাইনামিক মেমরি অ্যালোকেশন করে (হিপে)। delete[] অপারেটর সেটি ডি-অ্যালোকেট করে। প্রশ্ন: delete[] কীভাবে অ্যারের আকার জানে?
উত্তর: new[] অ্যালোকেশন করার সময় ব্লকের শুরুতে (হেডারে) উপাদান সংখ্যা সংরক্ষণ করে রাখে। এই মেটাডেটা ব্যবহার করে delete[] জানে কতটুকু মেমরি ফ്രീ করতে হবে। এটি ইমপ্লিমেন্টেশন-স্পেসিফিক (কম্পাইলার নির্ভর) কিন্তু সব কম্পাইলার इसीভাবে করে।
উদাহরণ কোড: ২D ডাইনামিক অ্যারে অ্যালোকেশন ও ডি-অ্যালোকেশন
#include <iostream>
using namespace std;
int main() {
int B = 4; // রো
int A = 5; // কলাম
// পয়েন্টার-টু-পয়েন্টার দিয়ে ২D অ্যারে
int** a = new int*[B]; // রো পয়েন্টার অ্যারে
for (int i = 0; i < B; ++i)
a[i] = new int[A]; // প্রতিটি রো আলাদা আলাদা
// ভ্যালু সেট
for (int i = 0; i < B; ++i)
for (int j = 0; j < A; ++j)
a[i][j] = i;
// প্রিন্ট
for (int i = 0; i < B; ++i)
for (int j = 0; j < A; ++j)
cout << a[i][j] << "\n";
// ডি-অ্যালোকেশন: 역বক্রমে
for (int i = 0; i < B; ++i)
delete[] a[i]; // প্রতিটি রো
delete[] a; // রো পয়েন্টার অ্যারে
return 0;
}
আউটপুট
0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
গুরুত্বপূর্ণ: ২D অ্যারেতে প্রতিটি রো আলাদা new[] দিয়ে অ্যালোকেট করা হয়েছে, তাই প্রতিটি রোকে আলাদা delete[] দিয়ে মুক্ত করতে হয়। সবশেষে রো পয়েন্টার অ্যারেকে delete[] দিয়ে মুক্ত করুন। আধুনিক C++-এ vector<vector<int>> বা vector<int> (ফ্ল্যাটেনড) ব্যবহার করা ভালো।