কম্পিউটার

হিপ ওভারফ্লো এবং স্ট্যাক ওভারফ্লো


হিপ ওভারফ্লো

ডাইনামিক ভেরিয়েবল সংরক্ষণ করতে হিপ ব্যবহার করা হয়। এটি প্রক্রিয়ার স্মৃতির একটি অঞ্চল। malloc(), calloc(), resize() এই সমস্ত ইনবিল্ট ফাংশনগুলি সাধারণত ডায়নামিক ভেরিয়েবল সঞ্চয় করতে ব্যবহৃত হয়৷

হিপ ওভারফ্লো ঘটে যখন −

ক) যদি আমরা গতিশীল বৃহৎ সংখ্যক ভেরিয়েবল −

বরাদ্দ করি
int main() {
   float *ptr = (int *)malloc(sizeof(float)*1000000.0));
}

খ) যদি আমরা ক্রমাগত মেমরি বরাদ্দ করি এবং এটি ব্যবহারের পরে মুক্ত না করি।

int main() {
   for (int i=0; i<100000000000; i++) {
      int *p = (int *)malloc(sizeof(int));
   }
}

স্ট্যাক ওভারফ্লো

স্ট্যাক একটি লাস্ট ইন ফার্স্ট আউট ডেটা স্ট্রাকচার। এটি স্থানীয় ভেরিয়েবল সংরক্ষণ করতে ব্যবহৃত হয় যা ফাংশনের ভিতরে ব্যবহৃত হয়। পরামিতি এই ফাংশন এবং তাদের ফেরত ঠিকানার মাধ্যমে পাস করা হয়।

যদি একটি প্রোগ্রাম বেশি মেমরি স্পেস ব্যবহার করে, তাহলে স্ট্যাক ওভারফ্লো ঘটবে কারণ কম্পিউটার মেমরিতে স্ট্যাকের আকার সীমিত।

স্ট্যাক ওভারফ্লো ঘটে যখন

ক) যদি একটি ফাংশনকে অনন্ত বার বার বার বলা হয় তাহলে স্ট্যাক বিপুল সংখ্যক স্থানীয় ভেরিয়েবল সংরক্ষণ করতে অক্ষম হবে, তাই স্ট্যাক ওভারফ্লো ঘটবে −

void calculate(int a) {
   if (a== 0)
      return;
      a = 6;
      calculate(a);
}
int main() {
   int a = 5;
   calculate(a);
}

খ) যদি আমরা প্রচুর সংখ্যক স্থানীয় ভেরিয়েবল ঘোষণা করি বা একটি বৃহৎ মাত্রিক অ্যারে বা ম্যাট্রিক্স ঘোষণা করি তাহলে স্ট্যাক ওভারফ্লো হতে পারে।

int main() {
   A[20000][20000];
}

  1. স্ট্যাক এবং হিপের মধ্যে পার্থক্য

  2. C++ এ বৃত্ত এবং আয়তক্ষেত্র ওভারল্যাপিং

  3. C++ এ ডোমিনো এবং ট্রোমিনো টাইলিং

  4. জাভাতে স্ট্যাক এবং হিপ মেমরির মধ্যে পার্থক্য