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

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


C++ प्रोग्राम के असामान्य व्यवहार से अक्सर प्रोग्राम क्रैश हो जाता है। आपको सेगमेंटेशन फॉल्ट, एबॉर्टेड, फ़्लोटिंग पॉइंट अपवाद आदि जैसी समस्याओं का सामना करना पड़ सकता है। निम्नलिखित नमूना प्रोग्राम हैं जो आपको 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)

विभाजन दोष

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

उदाहरण

#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);
}

  1. C++ में ऑक्टल से दशमलव रूपांतरण के लिए कार्यक्रम

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

  1. सी++ में पिरामिड के आयतन के लिए कार्यक्रम

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

  1. QuickSort के लिए C++ प्रोग्राम?

    क्विकसॉर्ट एक छँटाई तकनीक है जो एक क्रमबद्ध सूची (सरणी) को क्रमबद्ध करने के लिए तुलना का उपयोग करती है। Quicksort को पार्टीशन एक्सचेंज सॉर्ट के रूप में भी जाना जाता है। यह एक स्थिर प्रकार नहीं है, क्योंकि समान प्रकार की वस्तुओं का सापेक्ष क्रम संरक्षित नहीं है। क्विकसॉर्ट एक सरणी पर काम कर सकता है,