কম্পিউটার

একটি 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)

সেগমেন্টেশন ফল্ট

সেগমেন্টেশন ফল্ট বা কোর ডাম্প ঘটে যখন একটি প্রোগ্রাম মেমরি অবস্থানগুলি অ্যাক্সেস করার চেষ্টা করে যা এটির অন্তর্গত নয়। নিম্নলিখিত প্রোগ্রামে, পয়েন্টার স্ট্র অনির্দিষ্টকালের জন্য মেমরি বৃদ্ধি এবং সংযোজন করছে।

উদাহরণ

#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++ প্রোগ্রাম

  2. C++ এ অক্টাল থেকে দশমিক রূপান্তরের জন্য প্রোগ্রাম

  3. C++ এ পিরামিডের আয়তনের জন্য প্রোগ্রাম

  4. QuickSort-এর জন্য C++ প্রোগ্রাম?