কম্পিউটার টিউটোরিয়াল

C++-এ delete this?


Delete হলো একটি অপারেটর যা ভেরিয়েবলের স্টোরেজ স্পেস ডি-অ্যালোকেট করতে ব্যবহৃত হয়।

This পয়েন্টার হলো এমন একটি পয়েন্টার যা শুধু নন-স্ট্যাটিক মেম্বার ফাংশনের ভিতর থেকে অ্যাক্সেস করা যায় এবং এটি সেই অবজেক্টের অ্যাড্রেসকে পয়েন্ট করে যেমনে মেম্বার ফাংশনটি কল করেছে।

This পয়েন্টার কারেন্ট অবজেক্টের অ্যাড্রেস ধারণ করে, সহজ কথায় বললে এই পয়েন্টার ক্লাসের কারেন্ট অবজেক্টকে পয়েন্ট করে।

যখনই আমরা এর অবজেক্টের মাধ্যমে একটি মেম্বার ফাংশন কল করি, কম্পাইলার গোপনে কলিং অবজেক্টের অ্যাড্রেসকে ফার্স্ট প্যারামিটার হিসেবে মেম্বার ফাংশনে this পয়েন্টার হিসেবে পাস করে।

সাধারণত, delete অপারেটর this পয়েন্টারের জন্য ব্যবহার করা উচিত নয়। যদি ব্যবহার করা হয়, তবে নিচের পয়েন্টগুলো বিবেচনা করতে হবে।

আদর্শভাবে, delete অপারেটর this পয়েন্টারের জন্য ব্যবহার করা উচিত নয়। তবে, যদি ব্যবহার করা হয়, তবে নিচের পয়েন্টগুলো বিবেচনা করতে হবে।

  • delete অপারেটর শুধু operator new ব্যবহার করে অ্যালোকেট করা অবজেক্টের জন্য কাজ করে (এই পোস্টটি দেখুন)। যদি অবজেক্ট new ব্যবহার করে তৈরি করা হয়, তবে আমরা delete this করতে পারি, অন্যথায় বিহেভিয়র অনডিফাইনড।

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; }
  • একবার delete this হলে, ডিলিট করা অবজেক্টের যেকোনো মেম্বার ডিলিশনের পরে অ্যাক্সেস করা উচিত নয়।

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

সেরা বিষয় হলো delete this вообще না করা।

মেম্বার ফাংশনের ভিতরে this পয়েন্টার ডিলিট করা ভুল, আমাদের কখনো এটা করা উচিত নয়। কিন্তু যদি আমরা করি তবে নিচের বিষয়গুলো হতে পারে,

  • যদি সেই অবজেক্টটি जिससे এই মেম্বার ফাংশন কল করা হয়েছে স্ট্যাকে তৈরি করা হয়, তবে this পয়েন্টার ডিলিট করলে আপনার অ্যাপ্লিকেশন ক্র্যাশ করবে বা অনডিফাইনড বিহেভিয়র ফলাফল দেবে।

  • যদি সেই অবজেক্টটি जिससे এই মেম্বার ফাংশন কল করা হয়েছে হিপে new অপারেটর ব্যবহার করে তৈরি করা হয়, তবে this পয়েন্টার ডিলিট করলে অবজেক্টটি ডিস্ট্রয় হবে। সেটি সেটাইমে অ্যাপ্লিকেশন ক্র্যাশ করবে না কিন্তু এরপর, যদি কোনো মেম্বার ফাংশন এই অবজেক্টের মাধ্যমে মেম্বার ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করে তবে অ্যাপ্লিকেশন ক্র্যাশ করবে।

উদাহরণ

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

একবার destroy() মেম্বার ফাংশনে this পয়েন্টার ডিলিট করলে, এরপর displayText() কল করা সেফ কারণ এটি কোনো মেম্বার ফাংশন অ্যাক্সেস করছে না। কিন্তু displayValue() কল করলে অ্যাপ্লিকেশন ক্র্যাশ করবে কারণ এটি একটি ড্যাংলিং পয়েন্টার (ডিলিট করা this পয়েন্টার) এর মাধ্যমে মেম্বার ভেরিয়েবল অ্যাক্সেস করছে।


  1. C++-এ নির্দিষ্ট মান সহ লিফ নোড মুছুন

  2. C++-এ ট্রি নোড মুছে ফেলা

  3. BST-এ নোড ডিলিট C++-এ

  4. C++-এ কনস্ট মেম্বার ফাংশন