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

इसे सी ++ में हटाएं?

डिलीट एक ऐसा ऑपरेटर है जिसका उपयोग वेरिएबल के स्टोरेज स्पेस को डीलोकेट करने के लिए किया जाता है।

यह पॉइंटर एक प्रकार का पॉइंटर होता है जिसे एक्सेस किया जा सकता है लेकिन केवल नॉनस्टैटिक मेंबर फंक्शन के अंदर और यह उस ऑब्जेक्ट के पते की ओर इशारा करता है जिसे मेंबर फंक्शन कहा जाता है।

यह सूचक वर्तमान वस्तु का पता रखता है, सरल शब्दों में, आप कह सकते हैं कि यह सूचक वर्ग की वर्तमान वस्तु को इंगित करता है

जब भी हम किसी सदस्य फ़ंक्शन को उसके ऑब्जेक्ट के माध्यम से कॉल करते हैं, तो कंपाइलर गुप्त रूप से उस ऑब्जेक्ट को इस पॉइंटर के रूप में सदस्य फ़ंक्शन में पहले पैरामीटर के रूप में कॉल करने का पता पास करता है।

आम तौर पर, इस पॉइंटर के लिए डिलीट ऑपरेटर का उपयोग नहीं किया जाना चाहिए। मान लीजिए, यदि उपयोग किया जाता है, तो निम्नलिखित बिंदुओं पर विचार किया जाना चाहिए।

आदर्श रूप से, इस पॉइंटर के लिए डिलीट ऑपरेटर का उपयोग नहीं किया जाना चाहिए। हालांकि, यदि उपयोग किया जाता है, तो निम्नलिखित बिंदुओं पर विचार किया जाना चाहिए।

  • डिलीट ऑपरेटर केवल ऑपरेटर न्यू (इस पोस्ट को देखें) का उपयोग करके आवंटित वस्तुओं के लिए काम करता है। यदि ऑब्जेक्ट नए का उपयोग करके बनाया गया है, तो हम इसे हटा सकते हैं, अन्यथा, व्यवहार अपरिभाषित है।

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

एक बार जब हमने इस पॉइंटर को नष्ट () सदस्य फ़ंक्शन में हटा दिया, तो इसके बाद डिस्प्लेटेक्स्ट () को कॉल करना सुरक्षित है क्योंकि यह किसी भी सदस्य फ़ंक्शन तक नहीं पहुंच रहा है। लेकिन डिस्प्लेवैल्यू() को कॉल करने से एप्लिकेशन क्रैश हो जाएगा क्योंकि यह एक लटकते हुए पॉइंटर के माध्यम से सदस्य चर तक पहुंच रहा है यानी इस पॉइंटर को हटा दिया गया है।


  1. C++ में दिए गए मान के साथ पत्ते हटाएं

    मान लीजिए कि हमारे पास एक बाइनरी ट्री और एक पूर्णांक लक्ष्य है, हमें मूल्य लक्ष्य वाले सभी लीफ नोड्स को हटाना होगा। हमें यह ध्यान रखना होगा कि एक बार जब हम एक मूल्य लक्ष्य के साथ एक लीफ नोड को हटा देते हैं, यदि यह मूल नोड एक लीफ नोड बन जाता है और इसका मूल्य लक्ष्य होता है, तो इसे भी हटा दिया जाना चा

  1. C++ में ट्री नोड्स हटाएं

    मान लीजिए कि हमारे पास एक पेड़ है, इस पेड़ की जड़ें नोड 0 पर हैं, यह इस प्रकार दिया गया है - नोड्स की संख्या नोड्स है ith नोड का मान मान है[i] ith नोड का जनक माता-पिता है[i] हमें प्रत्येक सबट्री को हटाना होगा जिसका नोड्स के मानों का योग 0 है, ऐसा करने के बाद पेड़ में शेष नोड्स की संख्या वापस कर द

  1. सी ++ में बीएसटी में नोड हटाएं

    मान लीजिए कि हमारे पास एक बाइनरी सर्च ट्री है। हम एक कुंजी k लेंगे, और हमें दिए गए कुंजी k को BST से हटाना होगा, और अद्यतन BST को वापस करना होगा। तो अगर पेड़ जैसा है - और कुंजी k =3, तो आउटपुट ट्री होगा - इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - रूट नोड को हटाने के लिए deleteR