अपने स्रोत कोड में, कोई स्मृति रिसाव है जब से तुम जो गतिशील रूप से बनाई गई है किसी भी सदस्य चर नहीं है। ,
#include <iostream>
using namespace std;
class base
{
int a;
public:
base() {a =0;}
~base()
{
cout<<"\nBase Destructor called";
}
};
class derv :public base
{
int *b;
public:
derv() { b = new int;}
~derv()
{
cout<<"\nDerv Destructor called";
delete b;
}
};
int main()
{
base *pb = new derv();
delete pb;
}
इस मामले व्यवहृत किया जा सकेगा में,
Base Destructor called
इस मामले में एक स्मृति रिसाव होती है क्योंकि 'बी' डायनामिक रूप से तैयार किया गया है:
केस 1 नीचे संशोधित उदाहरण पर विचार करें 'नया' का उपयोग करके जिसे 'हटाएं' कीवर्ड का उपयोग करके हटाया जाना चाहिए। चूंकि डर्व विनाशक को नहीं कहा जा रहा है क्योंकि इसे हटाया नहीं गया है इसलिए स्मृति रिसाव है।
नीचे मामले 2 पर विचार करें:
#include <iostream>
using namespace std;
class base
{
int a;
public:
base() {a =0;}
virtual ~base()
{
cout<<"\nBase Destructor called";
}
};
class derv :public base
{
int *b;
public:
derv() { b = new int;}
~derv()
{
cout<<"\nDerv Destructor called";
delete b;
}
};
int main()
{
base *pb = new derv();
delete pb;
}
मामले 2 व्यवहृत किया जा सकेगा में,
Derv Destructor called
Base Destructor called
इस मामले में वहाँ derv नाशक leak.because कोई स्मृति कहा जाता है और ख हो रही है नष्ट कर दिया।
नाशक यकीन है कि व्युत्पन्न वर्ग नाशक जब हम आधार वर्ग सूचक जो व्युत्पन्न वर्ग वस्तु की ओर इशारा करते है को नष्ट करने के लिए कहा जा करने के लिए आधार वर्ग में आभासी रूप में परिभाषित किया जा सकता है।
हम कह सकते हैं कि जब व्युत्पन्न वर्ग ने गतिशील रूप से सदस्यों को बनाया है तो विनाशक आभासी होना चाहिए।
स्रोत
2012-01-06 12:37:08
यह आधार वर्ग है जिसे आभासी विनाशक की आवश्यकता है। – Yuushi
@ मिस्टिकियल: जेम्स के पास यह है। – Puppy
@ जेम्स, आपने कहा कि बेस क्लास में कोई वर्चुअल फ़ंक्शन नहीं है लेकिन यदि हम बेस क्लास का उत्तराधिकारी बनाना चाहते हैं तो इसमें वर्चुअल विनाशक होना चाहिए ?? – Alok