Destructors in C++
Destructor क्या है?
Destructor constructor का उल्टा है: यह object नष्ट होने पर अपने आप चलता है, उसे सफ़ाई का मौका देते हुए — memory मुक्त करना, files बंद करना, resources छोड़ना। इसका नाम class के नाम के आगे ~ के साथ होता है, और यह कोई arguments नहीं लेता।
Syntax और उदाहरण
#include <iostream>
using namespace std;
class Logger {
public:
Logger() { cout << "Created\n"; } // constructor
~Logger() { cout << "Destroyed\n"; } // destructor
};
int main() {
Logger l; // "Created"
cout << "Working...\n";
return 0; // "Destroyed" yahan chalta hai
}Created
Working...
Destroyed
यह कब call होता है?
- जब कोई local object scope से बाहर जाता है (उसका block समाप्त होता है)।
- जब heap object
deleteहोता है। - जब program समाप्त होता है, अब भी जीवित objects के लिए।
Local objects बनने के उल्टे क्रम में नष्ट होते हैं।
Resources मुक्त करना
Classic इस्तेमाल है वह memory छोड़ना जो class ने new से allocate की:
class Buffer {
int *data;
public:
Buffer(int n) { data = new int[n]; } // acquire
~Buffer() { delete[] data; } // release
};चूँकि destructor अपने आप चलता है, memory मुक्त होती है भले आप भूल जाएँ — जब तक object नष्ट हो।
RAII और rule of three
RAII — Resource Acquisition Is Initialization — किसी resource के जीवनकाल को object से बाँधने का C++ विचार है: constructor में लो, destructor में छोड़ो। यह सफ़ाई को भरोसेमंद बनाता है भले errors हों।
Rule of three: अगर आपकी class को custom destructor चाहिए, तो आमतौर पर उसे custom copy constructor और copy assignment operator भी चाहिए, क्योंकि तीनों resource प्रबंधन से जुड़े हैं। आधुनिक C++ अक्सर smart pointers इस्तेमाल करके इससे पूरी तरह बचता है।
आम गलतियाँ
~भूलना, तो यह constructor जैसा दिखता है।- Destructor को parameters या return type देना (इसके पास कोई नहीं)।
- Custom destructor चाहिए पर rule of three अनदेखा करना (double free)।
- Memory हाथ से प्रबंधित करना जब smart pointer इसे अपने आप संभालता।
एक class लिखें जिसका constructor "Opening" और destructor "Closing" print करे। एक block में दो objects बनाएँ और construction तथा destruction का क्रम देखें। फिर एक को new से बनाएँ और delete करें।
सारांश
- Destructor object नष्ट होने पर अपने आप चलता है।
~ClassName()नामित, बिना arguments या return type।- Scope के अंत में,
deleteपर, या program अंत में call होता है (उल्टा क्रम)। - Memory मुक्त करने और resources छोड़ने को इस्तेमाल — RAII का आधार।
- Custom destructor का मतलब आमतौर पर आपको rule of three चाहिए।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
C++ में destructor क्या है?
~Car(), कोई arguments नहीं लेता और कुछ नहीं लौटाता।