Delete হল একটি অপারেটর যা ভেরিয়েবলের স্টোরেজ স্পেস ডিলোকেট করতে ব্যবহৃত হয়।
এই পয়েন্টার হল এক ধরনের পয়েন্টার যা অ্যাক্সেস করা যায় কিন্তু শুধুমাত্র ননস্ট্যাটিক মেম্বার ফাংশনের ভিতরে এবং এটি বস্তুর ঠিকানা নির্দেশ করে যেটিকে মেম্বার ফাংশন বলা হয়েছে।
এই পয়েন্টারটি বর্তমান অবজেক্টের ঠিকানা ধারণ করে, সহজ কথায়, আপনি বলতে পারেন যে এই পয়েন্টারটি ক্লাসের বর্তমান অবজেক্টের দিকে নির্দেশ করে
যখনই আমরা একটি সদস্য ফাংশনকে তার অবজেক্টের মাধ্যমে কল করি, তখনই কম্পাইলার গোপনে সেই বস্তুটিকে সদস্য ফাংশনের প্রথম প্যারামিটার হিসাবে এই পয়েন্টার হিসাবে কল করার ঠিকানাটি পাস করে।
সাধারণত, ডিলিট অপারেটর এই পয়েন্টারের জন্য ব্যবহার করা উচিত নয়। ধরুন, যদি ব্যবহার করা হয়, তাহলে নিম্নলিখিত বিষয়গুলি অবশ্যই বিবেচনা করা উচিত।
আদর্শভাবে, ডিলিট অপারেটর এই পয়েন্টারের জন্য ব্যবহার করা উচিত নয়। যাইহোক, যদি ব্যবহার করা হয়, তাহলে নিম্নলিখিত বিষয়গুলি অবশ্যই বিবেচনা করা উচিত।
-
ডিলিট অপারেটর শুধুমাত্র নতুন অপারেটর ব্যবহার করে বরাদ্দ করা বস্তুর জন্য কাজ করে (এই পোস্টটি দেখুন)। যদি বস্তুটি নতুন ব্যবহার করে তৈরি করা হয়, তাহলে আমরা এটি মুছে ফেলতে পারি, অন্যথায়, আচরণটি অনির্ধারিত।
filter_none edit play_arrow brightness_4 class A { public: void fun() { delete this; } }; int main() { /* Following is Valid */ A *ptr = new A; ptr->fun(); ptr = NULL; // make ptr NULL to make sure that things are not accessed using ptr. /* And following is Invalid: Undefined Behavior */ A a; a.fun(); getchar(); return 0; }
-
একবার মুছে ফেলার পরে, মুছে ফেলা বস্তুর কোনো সদস্য মুছে ফেলার পরে অ্যাক্সেস করা উচিত নয়।
filter_none edit play_arrow brightness_4 #include<iostream> using namespace std; class A { int x; public: A() { x = 0;} void fun() { delete this; /* Invalid: Undefined Behavior */ cout<<x; } };
সর্বোত্তম জিনিস হল এটিকে একেবারেই মুছবেন না।
সদস্য ফাংশনের ভিতরে এই পয়েন্টারটি মুছে ফেলা ভুল, আমাদের এটি কখনই করা উচিত নয়। কিন্তু আমরা যদি এইগুলি করি তাহলে নিম্নলিখিত জিনিসগুলি ঘটতে পারে,
-
যদি সেই বস্তুটি যা থেকে এই সদস্য ফাংশনটি কল করা হয় সেটি স্ট্যাকে তৈরি করা হয় তাহলে এই পয়েন্টারটি মুছে দিলে হয় আপনার অ্যাপ্লিকেশনটি ক্র্যাশ হবে বা অনির্ধারিত আচরণের ফলে হবে৷
-
যে বস্তুটি থেকে এই সদস্য ফাংশনটি কল করা হয়েছে সেটি যদি নতুন অপারেটর ব্যবহার করে হিপে তৈরি করা হয়, তাহলে এই পয়েন্টারটি মুছে ফেলা বস্তুটি ধ্বংস করবে। এটি সেই নির্দিষ্ট সময়ে অ্যাপ্লিকেশনটিকে ক্র্যাশ করবে না তবে এর পরে, যদি কিছু সদস্য ফাংশন এই বস্তুর মাধ্যমে সদস্য ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করে তবে অ্যাপ্লিকেশনটি ক্র্যাশ হবে৷
উদাহরণ
#include <iostream> class Dummy { int m_value; public: Dummy(int val) : m_value(val) {} void destroy(); void displayValue(); void displayText(); }; void Dummy::destroy() { delete this; } void Dummy::displayValue() { std::cout << this->m_value << std::endl; } void Dummy::displayText() { std::cout << "Not accessing any member function" << std::endl; } int main() { Dummy * dummyPtr = new Dummy(5); dummyPtr->destroy(); dummyPtr->displayText(); return 0; }
একবার আমরা ডিসপ্লে() মেম্বার ফাংশনে এই পয়েন্টারটি মুছে ফেললে, এই কল করার পরে displayText() নিরাপদ কারণ এটি কোনও সদস্য ফাংশন অ্যাক্সেস করছে না। কিন্তু displayValue() কল করলে অ্যাপ্লিকেশনটি ক্র্যাশ হয়ে যাবে কারণ এটি একটি ড্যাংলিং পয়েন্টারের মাধ্যমে সদস্য ভেরিয়েবল অ্যাক্সেস করছে অর্থাৎ এই পয়েন্টারটি মুছে ফেলা হয়েছে।