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

C++ প্রোগ্রাম ক্র্যাশ হওয়ার কারণসমূহ


C++ প্রোগ্রামের অস্বাভাবিক আচরণ প্রায়শই প্রোগ্রাম ক্র্যাশের দিকে নিয়ে যায়। আপনি Segmentation fault, Aborted, Floating point exception এর মতো সমস্যা সম্মুখীন হতে পারেন। নিচে কিছু নমুনা প্রোগ্রাম দেওয়া হলো যা C++ প্রোগ্রাম ক্র্যাশের কারণ বোঝাতে সাহায্য করবে।

এক্সেপশন (Exceptions)

C++-এ এক্সেপশন হলো প্রোগ্রামের অস্বাভাবিক অবস্থায় প্রতিক্রিয়া। যদি এগুলো try-catch ব্লক দিয়ে হ্যান্ডেল না করা হয়, তবে প্রোগ্রাম ক্র্যাশ করে। নিচের প্রোগ্রাম divide by zero এক্সেপশনের কারণে ক্র্যাশ করে:

উদাহরণ ১: Divide by Zero

#include <iostream>
int main() {
    int num1 = 10;
    int num2 = 0;
    int quotient = num1 / num2; // শূন্য দিয়ে ভাগ
    printf("\n Quotient is: %d", quotient);
    return 0;
}

আউটপুট

Floating point exception (core dumped)

বাফার ওভারফ্লো (Buffer Overflow)

বাফার হলো একটি অস্থায়ী স্টোরেজ এলাকা। প্রোগ্রাম ডেটা লিখার সময় যদি বাফার ক্যাপাসিটি অতিক্রম করে, তবে অতিরিক্ত ডেটা আধিকviens মেমরি লোকেশনে চলে যায়। নিচের প্রোগ্রামে ইনপুট সাইজ বেশি হলে আচরণ পরিবর্তন হয়:

উদাহরণ ২: Buffer Overflow

#include <iostream>
#include <cstring>
int main() {
    int num = 100;
    cout << "\nValue for num: " << num;
    char c[2];
    strcpy(c, "abcdefghijklmnopqrstuvwxyz"); // ২ বাইটের বাফারে ২৬ ক্যারেক্টার কপি
    cout << "\nValue for c: " << c;
    return 0;
}

আউটপুট

Value for num: 100
Segmentation fault (core dumped)

স্ট্যাক ওভারফ্লো (Stack Overflow)

স্ট্যাক ওভারফ্লো হয় যখন কল স্ট্যাক পয়েন্টার স্ট্যাক বাউন্ড অতিক্রম করে। স্ট্যাকের লিমিটেড স্পেস থাকে। ইনফিনিট রিকার্শন সবচেয়ে সাধারণ কারণ। নিচের প্রোগ্রামে factorial() ফাংশনে ইনফিনিট রিকার্শন আছে:

উদাহরণ ৩: Stack Overflow

#include <iostream>
int factorial(int num) {
    if (num == 0) return 1;
    else return factorial(num); // ভুল: num ডিক্রিমেন্ট হচ্ছে না
}
int main() {
    int n = 10;
    int fact = factorial(n);
    cout << fact;
    return 0;
}

আউটপুট

Segmentation fault (core dumped)

সেগমেন্টেশন ফল্ট (Segmentation Fault)

সেগমেন্টেশন ফল্ট হয় যখন প্রোগ্রাম তার സ്വামित्वহীন মেমরি লোকেশন এক্সেস করতে চায়। নিচের প্রোগ্রামে পয়েন্টার str ইনডিফিনিটলি ইনক্রিমেন্ট এবং মেমরি রাইট করছে:

উদাহরণ ৪: Segmentation Fault

#include <iostream>
int main() {
    char* str;
    char name[] = "iostream";
    str = name;
    while (1)
        (*str++) = 'a'; // বাউন্ড চেক ছাড়া মেমরি রাইট
    return 0;
}

আউটপুট

Segmentation fault (core dumped)

মেমরি লিক (Memory Leaks)

মেমরি লিক হয় যখন ডাইনামিক্যালি এলোকেট করা মেমরি ডি-এলোকেট (free) করা হয় না। মেমরি আর ব্যবহার না হলে অবশ্যই free করতে হয়। বারবার মেমরি এলোকেট করলে कालান্তরে প্রোগ্রাম ক্র্যাশ করে।

উদাহরণ ৫: Memory Leak

#include <iostream>
#include <cstdlib>
int main() {
    int* node;
    node = (int*) malloc(9999999);
    // free(node); // কমেন্টড থাকায় মেমরি লিক
    return 0;
}
  1. C++ প্রোগ্রাম: অ্যারে উপাদানগুলোর গুণফল বের করা

  2. C++-এ অক্টাল থেকে ডেসিমেল কনভার্সন প্রোগ্রাম

  3. C++-এ পিরামিডের ভলিউম বের করার প্রোগ্রাম

  4. C++-এ কুইকসর্ট (QuickSort) প্রোগ্রাম