C++ प्रोग्राम का असामान्य व्यवहार अक्सर प्रोग्राम क्रैश की ओर ले जाता है। आपको सेगमेंटेशन गलती, निरस्त, फ़्लोटिंग पॉइंट अपवाद इत्यादि जैसी समस्याओं का सामना करना पड़ सकता है। निम्नलिखित नमूना प्रोग्राम हैं जो सी ++ प्रोग्राम क्रैश के कारणों को समझने में आपकी सहायता कर सकते हैं।
अपवाद
सी ++ में अपवाद किसी प्रोग्राम की प्रतिक्रियाएं हैं जब यह असामान्य स्थिति का सामना करता है। ऐसे अपवादों के कारण प्रोग्राम क्रैश हो जाता है यदि उन्हें ट्राइ-कैच ब्लॉक का उपयोग करके ठीक से नियंत्रित नहीं किया जाता है। शून्य अपवाद से भाग देने के कारण निम्न प्रोग्राम क्रैश हो जाता है -
उदाहरण
#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)
बफ़र ओवरफ़्लो
बफर एक अस्थायी भंडारण क्षेत्र है। जब कोई प्रोग्राम बफ़र को डेटा लिखते समय उस आकार से अधिक हो जाता है जो बफ़र धारण कर सकता है, तो अतिरिक्त डेटा बफ़र की सीमा से बाहर चला जाता है। डेटा आसन्न स्मृति स्थानों को अधिलेखित कर देता है। निम्न प्रोग्राम अपना व्यवहार बदलता है जब इनपुट आकार से अधिक हो जाता है, चर संख्या हो सकती है।
उदाहरण
#include <iostream> #include <string.h> int main(){ int num=100; std::cout<<"\nValue for num:"<<num; char c[2]; strcpy(c,"abcdefghijklmnopqrstuvwxyz"); std::cout<<"\nValue for c:"<<c; return 0; }
आउटपुट
Value for num:100 Segmentation fault (core dumped)
स्टैक ओवरफ़्लो
स्टैक ओवरफ़्लो समस्या तब होती है जब कॉल स्टैक पॉइंटर स्टैक बाउंड से अधिक हो जाता है। स्टैक में सीमित मात्रा में स्थान होता है। जब कोई प्रोग्राम स्टैक पर उपलब्ध स्थान से अधिक स्थान का उपयोग करता है तो स्टैक को ओवरफ़्लो कहा जाता है और प्रोग्राम को क्रैश करने का कारण बनता है। सबसे आम कारण अनंत पुनरावृत्ति है।
निम्नलिखित प्रोग्राम में फ़ैक्टोरियल () फ़ंक्शन करने के लिए अनंत कॉल हैं। इस मामले में वापसी विवरण उचित नहीं है।
उदाहरण
#include <iostream> #include <string.h> int factorial(int num){ if(num==0) return 1; else return(factorial(num)); } int main(){ int n=10; int fact=factorial(n); std::cout<<fact; }
आउटपुट
Segmentation fault (core dumped)
विभाजन दोष
सेगमेंटेशन फॉल्ट या कोर डंप तब होता है जब कोई प्रोग्राम उन मेमोरी स्थानों तक पहुँचने का प्रयास करता है जो उससे संबंधित नहीं हैं। निम्नलिखित प्रोग्राम में, पॉइंटर स्ट्रिस इंक्रीमेंटिंग और मेमोरी को अनिश्चित काल तक जोड़ता है।
उदाहरण
#include <iostream> int main(){ char *str; char name[]="iostream"; str=name; while(1) (*str++)='a'; }
आउटपुट
Segmentation fault (core dumped)
मेमोरी लीक
मेमोरी लीक तब होती है जब गतिशील रूप से आवंटित मेमोरी को कभी भी डिलीकेट नहीं किया जाता है। स्मृति को तब मुक्त किया जाना चाहिए जब वह उपयोग में न हो। यदि हम लगातार बार-बार मेमोरी आवंटित करते हैं, तो समय के साथ ये मेमोरी लीक बढ़ जाएगी और अंततः प्रोग्राम क्रैश हो जाएगा। नीचे दिए गए खराब कोड की पुनरावृत्ति मेमोरी लीक का कारण बनती है -
उदाहरण
#include <iostream> int main(){ int *node; node = (int *) malloc(9999999); // free(node); }