হিপ ওভারফ্লো (Heap Overflow)
হিপ ডাইনামিক ভেরিয়েবল স্টোর করতে ব্যবহৃত হয়। এটি প্রসেসের মেমরির একটি রিজন। malloc(), calloc(), resize() এই সব ইনবিল্ট ফাংশন সাধারণত ডাইনামিক ভেরিয়েবল স্টোর করতে ব্যবহৃত হয়।
হিপ ওভারফ্লো ঘটে যখন -
A) যদি আমরা বড় সংখ্যক ডাইনামিক ভেরিয়েবল অ্যালোকেট করি -
int main() {
float *ptr = (int *)malloc(sizeof(float) * 1000000.0));
}B) যদি আমরা liên tục মেমরি অ্যালোকেট করি এবং ব্যবহার করার পর ফ্রি না করি।
int main() {
for (int i = 0; i < 100000000000; i++) {
int *p = (int *)malloc(sizeof(int));
}
}স্ট্যাক ওভারফ্লো (Stack Overflow)
স্ট্যাক একটি লাস্ট-ইন-ফার্স্ট-আউট ডেটা স্ট্রাকচার। এটি ফাংশনের ভিতরে ব্যবহৃত লোকাল ভেরিয়েবল স্টোর করতে ব্যবহৃত হয়। প্যারামিটারগুলো এই ফাংশনের মাধ্যমে পাস হয় এবং তাদের রিটার্ন অ্যাড্রেস।
যদি একটি প্রোগ্রাম বেশি মেমরি স্পেস কনসাম করে, তবে স্ট্যাক ওভারফ্লো হবে কারণ কম্পিউটার মেমরিতে স্ট্যাক সাইজ লিমিটেড।
স্ট্যাক ওভারফ্লো ঘটে যখন
A) যদি একটি ফাংশন নিজেরাই রিকার্সিভলি অসীম বার কল করা হয় তবে স্ট্যাক বড় সংখ্যক লোকাল ভেরিয়েবল স্টোর করতে পারবে না, তাই স্ট্যাক ওভারফ্লো হবে -
void calculate(int a) {
if (a == 0)
return;
a = 6;
calculate(a);
}
int main() {
int a = 5;
calculate(a);
}B) যদি আমরা বড় সংখ্যক লোকাল ভেরিয়েবল ডিক্লেয়ার করি বা বড় ডাইমেনশনাল অ্যারে বা ম্যাট্রিক্স ডিক্লেয়ার করি তবে স্ট্যাক ওভারফ্লো হতে পারে।
int main() {
int A[20000][20000];
}