সি প্রোগ্রামিং ভাষায় ডাইনামিক মেমোরি ম্যানেজমেন্ট এমন একটি কৌশল যার মাধ্যমে প্রোগ্রাম চলাকালীন সময়ে মেমোরি বরাদ্দ ও মুক্ত করা যায়। এটি বিশেষ করে তখনই দরকার হয় যখন প্রোগ্রাম রানটাইমে মেমোরি চাহিদা অনুযায়ী পরিবর্তিত হয় এবং স্ট্যাটিক মেমোরি বরাদ্দ যথেষ্ট নয়।
ডাইনামিক মেমোরি ম্যানেজমেন্টে মূলত চারটি গুরুত্বপূর্ণ ফাংশন ব্যবহৃত হয়: malloc(), calloc(), realloc(), এবং free()।
ডাইনামিক মেমোরি ম্যানেজমেন্ট ফাংশন
১. malloc() ফাংশন
malloc() ফাংশন নির্দিষ্ট পরিমাণে মেমোরি বরাদ্দ করে এবং সেই মেমোরির শুরু ঠিকানাটি একটি পয়েন্টারে রিটার্ন করে। বরাদ্দকৃত মেমোরি আগের ডেটা দিয়ে অপরিবর্তিত থাকে, অর্থাৎ এটি আনইনিশিয়ালাইজড অবস্থায় থাকে।
গঠন:
void *malloc(size_t size);
size: মেমোরির পরিমাণ (বাইটে), যা বরাদ্দ করতে হবে।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)malloc(5 * sizeof(int)); // ৫টি ইন্টিজার জন্য মেমোরি বরাদ্দ
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
printf("%d ", ptr[i]);
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
আউটপুট:
1 2 3 4 5
২. calloc() ফাংশন
calloc() ফাংশনও মেমোরি বরাদ্দ করে, তবে এটি malloc() এর চেয়ে একটু আলাদা। calloc() মেমোরি ব্লকগুলোকে 0 দিয়ে ইনিশিয়ালাইজ করে এবং এটি একসাথে একাধিক মেমোরি ব্লক বরাদ্দ করে।
গঠন:
void *calloc(size_t num, size_t size);
num: মেমোরি ব্লকের সংখ্যা।size: প্রতিটি ব্লকের আকার (বাইটে)।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)calloc(5, sizeof(int)); // ৫টি ইন্টিজারের জন্য মেমোরি বরাদ্দ এবং শূন্য দিয়ে ইনিশিয়ালাইজ
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]); // প্রিন্ট করলে শূন্য দেখাবে
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
আউটপুট:
0 0 0 0 0
৩. realloc() ফাংশন
realloc() ফাংশন ডাইনামিক্যালি বরাদ্দকৃত মেমোরি ব্লকের আকার পরিবর্তন করতে ব্যবহৃত হয়। এটি নতুন আকারের মেমোরি বরাদ্দ করে এবং পুরনো মেমোরির ডেটা কপি করে।
গঠন:
void *realloc(void *ptr, size_t new_size);
ptr: পূর্বে বরাদ্দকৃত মেমোরির পয়েন্টার।new_size: নতুন মেমোরির আকার।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)malloc(3 * sizeof(int)); // প্রাথমিকভাবে ৩টি ইন্টিজারের মেমোরি বরাদ্দ
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// প্রাথমিক মান প্রদান
for (int i = 0; i < 3; i++) {
ptr[i] = i + 1;
}
// মেমোরি পুনরায় বরাদ্দ করা, মোট ৫টি ইন্টিজারের জন্য
ptr = (int*)realloc(ptr, 5 * sizeof(int));
if (ptr == NULL) {
printf("Memory reallocation failed!\n");
return 1;
}
// নতুন মেমোরি ব্লকে মান প্রদান
ptr[3] = 4;
ptr[4] = 5;
// মেমোরির ডেটা প্রিন্ট
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]);
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
আউটপুট:
1 2 3 4 5
৪. free() ফাংশন
free() ফাংশন ব্যবহার করে ডাইনামিক্যালি বরাদ্দকৃত মেমোরি মুক্ত করা হয়। এটি মেমোরি লিক প্রতিরোধে সহায়ক।
গঠন:
void free(void *ptr);
ptr: পূর্বে বরাদ্দকৃত মেমোরির পয়েন্টার।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)malloc(5 * sizeof(int));
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// মেমোরি ব্যবহারের পর মুক্ত করা
free(ptr);
return 0;
}
ডাইনামিক মেমোরি ম্যানেজমেন্টের সুবিধা
- রানটাইমে মেমোরি বরাদ্দ: মেমোরি চাহিদা অনুযায়ী রানটাইমে বরাদ্দ করা যায়।
- স্ট্যাটিক মেমোরি লিমিটেশন নেই: স্ট্যাটিক মেমোরির সীমাবদ্ধতা কাটিয়ে ওঠা যায়।
- বড় ডেটা হ্যান্ডলিং: বড় আকারের ডেটা পরিচালনা করা সহজ হয়।
- মেমোরি অপ্টিমাইজেশন: মেমোরি লিক প্রতিরোধে
free()ব্যবহার করে অপ্রয়োজনীয় মেমোরি মুক্ত করা যায়।
টিপস
malloc()এবংcalloc()ব্যবহারের পরে চেক করা উচিত যে মেমোরি সফলভাবে বরাদ্দ হয়েছে কিনা।realloc()ব্যবহার করার সময় পুরনো মেমোরির ঠিকানাটি মুক্ত করতে ভুলবেন না যদি এটি আর ব্যবহারযোগ্য না হয়।- মেমোরি ব্যবহারের পর অবশ্যই
free()দিয়ে মেমোরি মুক্ত করুন, অন্যথায় মেমোরি লিক হতে পারে।
ডাইনামিক মেমোরি ম্যানেজমেন্ট সি প্রোগ্রামিংয়ে মেমোরি ব্যবহারের কার্যকারিতা বৃদ্ধি করে এবং বড় আকারের ডেটা পরিচালনায় সহায়ক।
ডায়নামিক মেমোরি (Dynamic Memory) প্রোগ্রামিংয়ের একটি কনসেপ্ট, যা প্রোগ্রাম চলাকালীন সময়ে মেমোরি বরাদ্দ করতে এবং মুক্ত করতে সাহায্য করে। সাধারণত, এটি প্রোগ্রামিং ভাষাগুলোতে লাইব্রেরি ফাংশনের মাধ্যমে পরিচালিত হয়। উদাহরণস্বরূপ, C ভাষায় malloc(), calloc(), realloc() এবং free() ফাংশনগুলো ডায়নামিক মেমোরি ব্যবস্থাপনার জন্য ব্যবহৃত হয়।
ডায়নামিক মেমোরি কেন প্রয়োজন?
মেমোরির কার্যকর ব্যবহারের জন্য: ডায়নামিক মেমোরির মাধ্যমে প্রোগ্রাম চালানোর সময় যতটুকু মেমোরি প্রয়োজন ততটুকু বরাদ্দ করা যায়। এর ফলে মেমোরির অপচয় কম হয় এবং অ্যাপ্লিকেশন দ্রুত চলে।
অনিশ্চিত মেমোরি প্রয়োজনীয়তা: অনেক সময় প্রোগ্রামের শুরুতেই মেমোরির প্রয়োজনীয়তা পূর্বানুমান করা সম্ভব হয় না। যেমন, একটি অ্যারে ব্যবহারের ক্ষেত্রে ঠিক কত সংখ্যক উপাদান রাখতে হবে তা জানা না থাকলে ডায়নামিক মেমোরি বরাদ্দ করতে হয়।
বৃহৎ ডেটা ব্যবস্থাপনা: যখন বড় ডেটা বা বড় আকারের অ্যারে বা স্ট্রাকচার পরিচালনা করতে হয়, তখন স্ট্যাটিক মেমোরি অপ্রতুল হতে পারে। ডায়নামিক মেমোরি ব্যবহারের মাধ্যমে ইচ্ছামতো বড় সাইজের ডেটা রাখা সম্ভব।
অ্যারে বা ডেটা স্ট্রাকচারের আকার পরিবর্তনযোগ্য করার জন্য: স্ট্যাটিক মেমোরিতে অ্যারের আকার স্থির থাকে, যা পরিবর্তন করা সম্ভব নয়। কিন্তু ডায়নামিক মেমোরিতে অ্যারে বা লিস্টের আকার পরিবর্তন করা যায়।
মেমোরি পুনর্ব্যবহার: ডায়নামিক মেমোরি ব্যবহারের মাধ্যমে অব্যবহৃত মেমোরি মুক্ত করা যায়, যাতে অন্য কাজে সেটি ব্যবহৃত হতে পারে।
উদাহরণ:
নিচে একটি ছোট উদাহরণ দেওয়া হলো যেখানে malloc() এবং free() ফাংশন ব্যবহার করা হয়েছে:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// n সংখ্যক ইন্টিজার স্টোর করার জন্য ডায়নামিক মেমোরি বরাদ্দ
arr = (int*) malloc(n * sizeof(int));
// মেমোরি সফলভাবে বরাদ্দ হয়েছে কিনা পরীক্ষা
if (arr == NULL) {
printf("Memory allocation failed.\n");
return 1;
}
// মেমোরি ব্যবহার
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// আউটপুট
printf("Array elements: ");
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
// মেমোরি মুক্ত
free(arr);
return 0;
}
উপসংহার
ডায়নামিক মেমোরি প্রোগ্রামিংয়ে মেমোরি ব্যবস্থাপনার স্বাধীনতা ও মেমোরি ব্যবহারের কার্যকারিতা বৃদ্ধি করে।
সি প্রোগ্রামিং ভাষায় মেমোরি বরাদ্দ এবং মেমোরি মুক্ত করা গুরুত্বপূর্ণ অংশ। যখন প্রোগ্রাম চলমান থাকে তখন মেমোরি চাহিদা অনুযায়ী ডাইনামিক মেমোরি বরাদ্দ এবং মুক্ত করার জন্য প্রধানত তিনটি ফাংশন ব্যবহার করা হয়: malloc(), calloc() এবং free()।
মেমোরি বরাদ্দ
১. malloc() ফাংশন
malloc() (Memory Allocation) ফাংশন নির্দিষ্ট পরিমাণ মেমোরি বরাদ্দ করে এবং বরাদ্দকৃত মেমোরির প্রথম বাইটের ঠিকানাটি রিটার্ন করে। এটি বরাদ্দকৃত মেমোরি ব্লকটি আনইনিশিয়ালাইজড অবস্থায় রাখে, অর্থাৎ এই মেমোরি ব্লকে কোনো ডেটা থাকে না।
গঠন:
void *malloc(size_t size);
size: বরাদ্দকৃত মেমোরির আকার (বাইটে)।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)malloc(5 * sizeof(int)); // ৫টি ইন্টিজার সাইজের মেমোরি বরাদ্দ
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
printf("%d ", ptr[i]);
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
আউটপুট:
1 2 3 4 5
ব্যাখ্যা: malloc ৫টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করেছে, এবং ptr সেই মেমোরি ব্লকের প্রথম বাইটের ঠিকানা পেয়েছে। লুপের মাধ্যমে প্রতিটি ব্লকে একটি মান প্রদান করা হয়েছে।
২. calloc() ফাংশন
calloc() (Contiguous Allocation) ফাংশনও মেমোরি বরাদ্দ করে, তবে এটি একসাথে একাধিক মেমোরি ব্লক বরাদ্দ করে এবং বরাদ্দকৃত মেমোরি শূন্য (০) দিয়ে ইনিশিয়ালাইজ করে।
গঠন:
void *calloc(size_t num, size_t size);
num: ব্লকের সংখ্যা।size: প্রতিটি ব্লকের আকার (বাইটে)।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)calloc(5, sizeof(int)); // ৫টি ইন্টিজারের জন্য মেমোরি বরাদ্দ এবং শূন্য দিয়ে ইনিশিয়ালাইজ
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
for (int i = 0; i < 5; i++) {
printf("%d ", ptr[i]); // প্রিন্ট করলে শূন্য দেখাবে
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
আউটপুট:
0 0 0 0 0
ব্যাখ্যা: calloc ৫টি ইন্টিজার সাইজের মেমোরি বরাদ্দ করেছে এবং প্রতিটি ব্লক শূন্য দিয়ে ইনিশিয়ালাইজ করেছে।
মেমোরি মুক্ত করা
free() ফাংশন
free() ফাংশন ডাইনামিক্যালি বরাদ্দকৃত মেমোরি মুক্ত করে, অর্থাৎ ডেটা আর সংরক্ষণ করা হবে না এবং সিস্টেমে মেমোরি পুনরায় ব্যবহারযোগ্য হিসেবে ফেরত দেওয়া হয়। free() ফাংশন ডেটা মুছে দেয় না, তবে মেমোরি ব্লকটি পুনরায় ব্যবহারের জন্য মুক্ত করে।
গঠন:
void free(void *ptr);
ptr: যে পয়েন্টারে বরাদ্দকৃত মেমোরি আছে তার ঠিকানা।
উদাহরণ:
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr;
ptr = (int*)malloc(5 * sizeof(int)); // মেমোরি বরাদ্দ করা
if (ptr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// মেমোরি ব্যবহার
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
free(ptr); // মেমোরি মুক্ত করা
return 0;
}
ব্যাখ্যা:
mallocফাংশন মেমোরি বরাদ্দ করেছে।- মেমোরি ব্যবহার করে কিছু মান সংরক্ষণ করা হয়েছে।
free()ফাংশন সেই মেমোরি ব্লকটি মুক্ত করেছে।
malloc() এবং calloc() এর পার্থক্য
| বৈশিষ্ট্য | malloc() | calloc() |
|---|---|---|
| মেমোরি ইনিশিয়ালাইজেশন | মেমোরি ব্লক ইনিশিয়ালাইজ করে না | বরাদ্দকৃত মেমোরি ব্লকগুলো শূন্য দিয়ে ইনিশিয়ালাইজ করে |
| প্যারামিটার | বরাদ্দকৃত মেমোরির আকার (বাইটে) | ব্লক সংখ্যা এবং প্রতিটি ব্লকের আকার (বাইটে) |
| ব্যবহার | সাধারণ মেমোরি বরাদ্দে ব্যবহৃত | নির্দিষ্ট সংখ্যা ব্লকের মেমোরি বরাদ্দে ব্যবহৃত |
মেমোরি ম্যানেজমেন্ট টিপস
malloc()এবংcalloc()ব্যবহারের পরে সবসময় চেক করুন মেমোরি বরাদ্দ সফল হয়েছে কিনা।- মেমোরি ব্যবহার শেষ হলে
free()ফাংশন ব্যবহার করে মেমোরি মুক্ত করুন, যা মেমোরি লিক প্রতিরোধে সহায়ক। free()ফাংশন বারবার ডাকা থেকে বিরত থাকুন, কারণ এটি ত্রুটি তৈরি করতে পারে।
সংক্ষেপে
malloc(): নির্দিষ্ট পরিমাণ মেমোরি বরাদ্দ করে, কিন্তু ইনিশিয়ালাইজ করে না।calloc(): নির্দিষ্ট সংখ্যা ব্লকের মেমোরি বরাদ্দ করে এবং শূন্য দিয়ে ইনিশিয়ালাইজ করে।free(): মেমোরি ব্লক মুক্ত করে এবং পুনরায় ব্যবহারের জন্য উপলব্ধ করে।
ডাইনামিক মেমোরি ম্যানেজমেন্ট সি প্রোগ্রামে মেমোরি ব্যবহারের কার্যকারিতা বৃদ্ধি করে এবং বড় আকারের ডেটা পরিচালনা সহজ করে।
মেমোরি লিক (Memory Leak) হলো এমন একটি অবস্থা যখন প্রোগ্রাম চলাকালীন সময়ে ব্যবহৃত মেমোরি সঠিকভাবে মুক্ত (release) করা হয় না, ফলে মেমোরি ব্যবহৃত অবস্থায় থেকে যায় এবং পরবর্তীতে আর ব্যবহার করা সম্ভব হয় না। একাধিক মেমোরি লিকের কারণে প্রোগ্রামের মেমোরি খরচ বৃদ্ধি পায় এবং অ্যাপ্লিকেশন ধীরগতি বা ক্র্যাশ হওয়ার সম্ভাবনা থাকে।
মেমোরি লিকের কারণসমূহ
- মুক্ত না করা মেমোরি: ডায়নামিক মেমোরি বরাদ্দের পরে
free()ফাংশন ব্যবহার করে মেমোরি মুক্ত না করলে তা মেমোরি লিকের কারণ হতে পারে। - পয়েন্টার লস: যখন একটি পয়েন্টারকে অন্য কোনো মেমোরি ঠিকানায় পয়েন্ট করানো হয়, তখন পূর্বের ঠিকানা হারিয়ে যায়, ফলে পূর্বের মেমোরিটি মুক্ত করা সম্ভব হয় না।
- অবাঞ্ছিত রেফারেন্স: অবাঞ্ছিত মেমোরি রেফারেন্স থাকা এবং সেই রেফারেন্সগুলো ভুলভাবে ব্যবহৃত হওয়া।
- সার্কুলার রেফারেন্স: কিছু প্রোগ্রামিং ভাষায় অবজেক্টগুলো নিজেদের মধ্যে সার্কুলারভাবে রেফারেন্স রাখে, ফলে তাদের স্বয়ংক্রিয়ভাবে মুক্ত করা সম্ভব হয় না।
মেমোরি লিক প্রতিরোধের উপায়
ডায়নামিক মেমোরি বরাদ্দের পরে মুক্ত করা: প্রতিটি malloc(), calloc() বা realloc() এর সাথে সংশ্লিষ্ট free() ফাংশন ব্যবহার করতে হবে।
int *ptr = (int*) malloc(sizeof(int) * 10);
// মেমোরি ব্যবহারের পর মুক্ত
free(ptr);
ধারণকৃত পয়েন্টারদের যত্নসহকারে ব্যবহার: মেমোরি বরাদ্দের পর পয়েন্টার হারানো এড়াতে সর্তকতা অবলম্বন করা উচিত।
রেফারেন্স নিয়ন্ত্রণ: যে রেফারেন্সগুলো আর প্রয়োজন নেই সেগুলোকে NULL সেট করুন, যাতে পরে প্রয়োজনে তা চেক করা যায় এবং ভুলভাবে ব্যবহারের সম্ভাবনা কমে।
স্মার্ট পয়েন্টার ব্যবহার: C++ এ স্মার্ট পয়েন্টার ব্যবহার করা যেতে পারে, যেমন std::shared_ptr, std::unique_ptr, যা মেমোরি মুক্তির প্রক্রিয়াকে স্বয়ংক্রিয় করে।
স্মৃতি ব্যবস্থাপনার জন্য ডিবাগ টুল ব্যবহার: বিভিন্ন ডিবাগ টুল যেমন Valgrind, AddressSanitizer ব্যবহার করে মেমোরি লিক ডিবাগ করা যায়। এ ধরনের টুল ব্যবহার করলে কোন স্থানে মেমোরি লিক হচ্ছে তা দ্রুত শনাক্ত করা সম্ভব।
সার্কুলার রেফারেন্স এড়ানো: অবজেক্টের মধ্যে কোনো সার্কুলার রেফারেন্স তৈরি না করা এবং তৈরি হলে তা যত দ্রুত সম্ভব দূর করার চেষ্টা করা।
উদাহরণ
নিচে মেমোরি লিক এবং তা প্রতিরোধের একটি উদাহরণ দেওয়া হলো:
#include <stdio.h>
#include <stdlib.h>
void createMemoryLeak() {
int *arr = (int*) malloc(sizeof(int) * 10);
// কিছু কার্য সম্পাদন
// free(arr); // মেমোরি মুক্ত না করলে মেমোরি লিক হবে
}
void preventMemoryLeak() {
int *arr = (int*) malloc(sizeof(int) * 10);
if (arr == NULL) {
printf("Memory allocation failed.\n");
return;
}
// কিছু কার্য সম্পাদন
free(arr); // মেমোরি মুক্ত, মেমোরি লিক প্রতিরোধ করা হলো
}
int main() {
createMemoryLeak(); // এখানে মেমোরি লিক হবে
preventMemoryLeak(); // এখানে মেমোরি লিক প্রতিরোধ করা হয়েছে
return 0;
}
উপসংহার
মেমোরি লিকের কারণে প্রোগ্রাম ক্র্যাশ বা অপ্রয়োজনীয় মেমোরি খরচ হতে পারে। সঠিক পদ্ধতি মেনে মেমোরি বরাদ্দ ও মুক্তির মাধ্যমে মেমোরি লিক প্রতিরোধ করা সম্ভব।
ডাইনামিক মেমোরি ব্যবহারের পদ্ধতি সি প্রোগ্রামিং ভাষায় খুবই গুরুত্বপূর্ণ, বিশেষত তখন যখন প্রোগ্রামের মেমোরি চাহিদা রানটাইমে পরিবর্তিত হয়। malloc(), calloc(), realloc(), এবং free() ফাংশনগুলো ব্যবহার করে মেমোরি বরাদ্দ এবং মুক্ত করা যায়। নিচে কিছু উদাহরণের মাধ্যমে ডাইনামিক মেমোরি ব্যবহারের পদ্ধতি দেখানো হলো।
১. malloc() ব্যবহার করে ডাইনামিক মেমোরি বরাদ্দ
malloc() ফাংশন দিয়ে ডাইনামিক মেমোরি বরাদ্দ করা হয় এবং এটি বরাদ্দকৃত মেমোরি ব্লকটি ইনিশিয়ালাইজ করে না। এখানে আমরা ৫টি ইন্টিজার রাখার জন্য মেমোরি বরাদ্দ করব।
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// ৫টি ইন্টিজারের জন্য ডাইনামিক মেমোরি বরাদ্দ
arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// মান অ্যাসাইন ও প্রিন্ট
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
printf("%d ", arr[i]);
}
// মেমোরি মুক্ত করা
free(arr);
return 0;
}
আউটপুট:
1 2 3 4 5
ব্যাখ্যা:
- এখানে
malloc()ব্যবহার করে ৫টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করা হয়েছে। - লুপের মাধ্যমে প্রতিটি ইন্টিজারে মান অ্যাসাইন ও প্রিন্ট করা হয়েছে।
- শেষে
free()ব্যবহার করে বরাদ্দকৃত মেমোরি মুক্ত করা হয়েছে।
২. calloc() ব্যবহার করে ডাইনামিক মেমোরি বরাদ্দ
calloc() ফাংশন মেমোরি বরাদ্দ করার পর সমস্ত ব্লককে শূন্য দিয়ে ইনিশিয়ালাইজ করে। এখানে ৫টি ইন্টিজারের মেমোরি বরাদ্দ করব এবং প্রতিটি মেমোরি ব্লক ইনিশিয়ালাইজ করা থাকবে।
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// ৫টি ইন্টিজারের জন্য ডাইনামিক মেমোরি বরাদ্দ এবং শূন্য দিয়ে ইনিশিয়ালাইজ
arr = (int*)calloc(n, sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// প্রিন্ট করা
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]); // প্রত্যেকটি মান শূন্য দেখাবে
}
// মেমোরি মুক্ত করা
free(arr);
return 0;
}
আউটপুট:
0 0 0 0 0
ব্যাখ্যা:
calloc()ব্যবহার করে ৫টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করা হয়েছে।- প্রতিটি মেমোরি ব্লক শূন্য দিয়ে ইনিশিয়ালাইজ করা হয়েছে।
- শেষে
free()ব্যবহার করে মেমোরি মুক্ত করা হয়েছে।
৩. realloc() ব্যবহার করে ডাইনামিক মেমোরি পুনরায় বরাদ্দ
realloc() ফাংশন পূর্বে বরাদ্দকৃত মেমোরি ব্লকের আকার পরিবর্তন করতে ব্যবহার করা হয়। এখানে শুরুতে ৩টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করা হবে, পরে realloc() ব্যবহার করে এটিকে ৫টি ইন্টিজারে বৃদ্ধি করা হবে।
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 3;
// প্রাথমিকভাবে ৩টি ইন্টিজারের জন্য মেমোরি বরাদ্দ
arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// প্রথম ৩টি মান অ্যাসাইন করা
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// মেমোরি ব্লক পুনরায় বরাদ্দ করে ৫টি ইন্টিজারের জন্য বাড়ানো
n = 5;
arr = (int*)realloc(arr, n * sizeof(int));
if (arr == NULL) {
printf("Memory reallocation failed!\n");
return 1;
}
// নতুন ২টি মান অ্যাসাইন করা
arr[3] = 4;
arr[4] = 5;
// সকল মান প্রিন্ট করা
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
// মেমোরি মুক্ত করা
free(arr);
return 0;
}
আউটপুট:
Copy code
1 2 3 4 5
ব্যাখ্যা:
- প্রাথমিকভাবে
malloc()ব্যবহার করে ৩টি ইন্টিজারের জন্য মেমোরি বরাদ্দ করা হয়েছে। - পরে
realloc()ব্যবহার করে মেমোরির আকার বাড়িয়ে ৫টি ইন্টিজারের জন্য করা হয়েছে। - শেষে
free()ব্যবহার করে মেমোরি মুক্ত করা হয়েছে।
৪. free() ব্যবহার করে মেমোরি মুক্ত করা
ডাইনামিক মেমোরি ব্যবহারের পরে মেমোরি লিক প্রতিরোধে free() ফাংশন ব্যবহার করে মেমোরি মুক্ত করতে হয়। এটি সিস্টেমে মেমোরি পুনরায় ব্যবহারযোগ্য করে তোলে।
#include <stdio.h>
#include <stdlib.h>
int main() {
int *arr;
int n = 5;
// মেমোরি বরাদ্দ করা
arr = (int*)malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// মেমোরি ব্যবহার
for (int i = 0; i < n; i++) {
arr[i] = i + 1;
}
// মেমোরি মুক্ত করা
free(arr);
// মেমোরি মুক্ত করার পর পুনরায় ব্যবহার এড়িয়ে চলা উচিত
return 0;
}
ব্যাখ্যা:
free()ফাংশন দিয়ে মেমোরি মুক্ত করা হয়েছে, যাতে সিস্টেমের মেমোরি পুনরায় ব্যবহারযোগ্য হয়।
সারসংক্ষেপ
malloc(): নির্দিষ্ট পরিমাণ মেমোরি বরাদ্দ করে কিন্তু ইনিশিয়ালাইজ করে না।calloc(): নির্দিষ্ট সংখ্যা ব্লকের মেমোরি বরাদ্দ করে এবং শূন্য দিয়ে ইনিশিয়ালাইজ করে।realloc(): পূর্বে বরাদ্দকৃত মেমোরির আকার পরিবর্তন করে।free(): ডাইনামিক্যালি বরাদ্দকৃত মেমোরি মুক্ত করে।
ডাইনামিক মেমোরি ব্যবহারের এই পদ্ধতিগুলো সি প্রোগ্রামিংয়ে মেমোরি ব্যবহারের কার্যকারিতা বৃদ্ধি করে এবং বড় আকারের ডেটা ম্যানেজমেন্টে সহায়ক হয়।
Read more