Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

C++ प्रोग्राम क्रैश होने के कारण


C++ प्रोग्राम्स का असामान्य व्यवहार अक्सर प्रोग्राम क्रैश की ओर ले जाता है। आपने सेगमेंटेशन फॉल्ट, अबॉर्टेड, फ्लोटिंग पॉइंट एक्सेप्शन जैसी समस्याओं का सामना किया होगा। निम्नलिखित नमूना प्रोग्राम C++ प्रोग्राम क्रैश के कारणों को समझने में आपकी मदद कर सकते हैं।

एक्सेप्शन्स (अपवाद)

C++ में एक्सेप्शन्स प्रोग्राम की प्रतिक्रियाएं होती हैं जब यह असामान्य स्थिति का सामना करता है। यदि उन्हें ट्राई-कैच ब्लॉक्स का उपयोग करके ठीक से संभाला नहीं जाता है तो प्रोग्राम ऐसे एक्सेप्शन्स के कारण क्रैश हो जाता है। निम्नलिखित प्रोग्राम डिवाइड बाय ज़ीरो एक्सेप्शन के कारण क्रैश होता है:

उदाहरण

#include <iostream>
using namespace std;

int main() {
    int num1 = 10;
    int num2 = 0;
    int quotient = num1 / num2;
    cout << "\n Quotient is: " << quotient;
    return 0;
}

आउटपुट

Floating point exception (core dumped)

बफर ओवरफ्लो

बफर एक अस्थायी स्टोरेज क्षेत्र है। जब कोई प्रोग्राम बफर में डेटा लिखते समय उस आकार से अधिक डेटा लिखता है जिसे बफर धारण कर सकता है, तो अतिरिक्त डेटा बफर की सीमा से बाहर चला जाता है। डेटा आसन्न मेमोरी स्थानों को ओवरराइट कर देता है। निम्नलिखित प्रोग्राम अपना व्यवहार बदलता है जब इनपुट उस आकार से अधिक होता है जिसे वेरिएबल num धारण कर सकता है।

उदाहरण

#include <iostream>
#include <cstring>
using namespace std;

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)

स्टैक ओवरफ्लो

स्टैक ओवरफ्लो समस्या तब होती है जब कॉल स्टैक पॉइंटर स्टैक बाउंड से अधिक हो जाता है। स्टैक में सीमित मात्रा में स्थान होता है। जब कोई प्रोग्राम स्टैक पर उपलब्ध स्थान से अधिक स्थान का उपयोग करता है तो स्टैक ओवरफ्लो हो जाता है और प्रोग्राम क्रैश हो जाता है। सबसे आम कारण अनंत रिकर्सन है।

निम्नलिखित प्रोग्राम में factorial() फंक्शन के अनंत कॉल हैं। इस मामले में रिटर्न स्टेटमेंट उचित नहीं है।

उदाहरण

#include <iostream>
using namespace std;

int factorial(int num) {
    if (num == 0)
        return 1;
    else
        return factorial(num); // बग: num-1 होना चाहिए
}

int main() {
    int n = 10;
    int fact = factorial(n);
    cout << fact;
    return 0;
}

आउटपुट

Segmentation fault (core dumped)

सेगमेंटेशन फॉल्ट

सेगमेंटेशन फॉल्ट या कोर डंप तब होता है जब कोई प्रोग्राम उन मेमोरी स्थानों को एक्सेस करने की कोशिश करता है जो उसके नहीं होते। निम्नलिखित प्रोग्राम में, पॉइंटर str अनिश्चित काल तक इंक्रीमेंट हो रहा है और मेमोरी में जोड़ रहा है।

उदाहरण

#include <iostream>
using namespace std;

int main() {
    char* str;
    char name[] = "iostream";
    str = name;
    while (1)
        (*str++) = 'a';
    return 0;
}

आउटपुट

Segmentation fault (core dumped)

मेमोरी लीक

मेमोरी लीक तब होती है जब डायनामिकली अलोकेटेड मेमोरी कभी डीअलोकेट नहीं की जाती। मेमोरी को तब फ्री किया जाना चाहिए जब यह उपयोग में न हो। यदि हम बार-बार मेमोरी अलोकेट करते रहते हैं, तो समय के साथ ये मेमोरी लीक बढ़ती जाएंगी और अंततः प्रोग्राम को क्रैश कर देंगी। नीचे दिए गए खराब कोड की पुनरावृत्ति मेमोरी लीक का कारण बनती है:

उदाहरण

#include <iostream>
#include <cstdlib>
using namespace std;

int main() {
    int* node;
    node = (int*) malloc(9999999);
    // free(node); // यह लाइन कमेंटेड है, जिससे मेमोरी लीक होती है
    return 0;
}

  1. C++ में ऑक्टल से डेसिमल रूपांतरण C++ में ऑक्टल से डेसिमल रूपांतरण

    एक ऑक्टल संख्या इनपुट के रूप में दी गई है, कार्य दी गई ऑक्टल संख्या को डेसिमल संख्या में बदलना है। कंप्यूटर में डेसिमल संख्याओं को आधार 10 के साथ दर्शाया जाता है और ऑक्टल संख्या को आधार 8 के साथ दर्शाया जाता है जो अंक 0 से 7 तक होती है जबकि डेसिमल संख्याएं 0-9 से शुरू होने वाला कोई भी संख्यात्मक अंक

  1. C++ में पिरामिड के आयतन का प्रोग्राम C++ में पिरामिड के आयतन का प्रोग्राम

    पिरामिड के बेस के प्रकार के आधार पर भुजाएं दी गई हैं, कार्य पिरामिड का आयतन गणना करना है।पिरामिड एक 3-D आकृति है जिसकी बाहरी सतहें त्रिकोणीय हैं जो सामान्य बिंदु पर मिलती हैं जिससे पिरामिड का तीक्ष्ण किनारा बनता है। पिरामिड का आयतन उसके बेस के प्रकार पर निर्भर करता है।पिरामिड के बेस के विभिन्न प्रका

  1. C++ में क्विकसॉर्ट प्रोग्राम C++ में क्विकसॉर्ट प्रोग्राम

    क्विकसॉर्ट क्या है? क्विकसॉर्ट एक सॉर्टिंग तकनीक है जो अनसॉर्टेड सूची (सरणी) को सॉर्ट करने के लिए तुलनाओं का उपयोग करती है। क्विकसॉर्ट को पार्टीशन एक्सचेंज सॉर्ट के नाम से भी जाना जाता है। यह एक स्थिर सॉर्ट नहीं है, क्योंकि समान सॉर्ट आइटम्स का सापेक्ष क्रम संरक्षित नहीं रहता। क्विकसॉर्ट एक सरणी प