क्योंकि आप कर रहे हैं (अन) भाग्यशाली। auto_ptr
कॉल delete
, delete []
पर नहीं। यह अपरिभाषित व्यवहार है।
कुछ इस तरह कर रही है और यदि आप के रूप में जीत जाएं देखने का प्रयास करें:
struct Foo
{
char *bar;
Foo(void) : bar(new char[100]) { }
~Foo(void) { delete [] bar; }
}
int iterCount = 1000;
int sizeBig = 100000;
for (int i = 0; i < iterCount; i++)
{
std::auto_ptr<Foo> buffer(new Foo[sizeBig]);
}
विचार है कि यहाँ Foo
के लिए अपने नाशक नहीं बुलाया जाएगा।
कारण कुछ इस तरह है: जब आप कहते हैं कि delete[] p
, delete[]
के कार्यान्वयन सरणी में प्रत्येक तत्व के लिए जाना है, इसके नाशक फोन है, तो मुक्त कर स्मृति पी द्वारा की ओर इशारा किया के लिए लगता है। इसी प्रकार, delete p
पी पर विनाशक को कॉल करने का अनुमान है, फिर स्मृति को मुक्त करें।
char
के पास विनाशक नहीं है, इसलिए यह सिर्फ पी द्वारा इंगित स्मृति को हटाने जा रहा है। उपरोक्त मेरे कोड में, यह सरणी में प्रत्येक तत्व को नष्ट करने जा रहा है (क्योंकि यह delete[]
पर कॉल नहीं कर रहा है), इसलिए कुछ Foo उनके स्थानीय बार चर को हटाएंगे।
ज्यादातर मामलों में यदि आप हटाएं [] के साथ नया जोड़ते हैं और गैर-तुच्छ प्रकारों के विपरीत इसके विपरीत यह रिसाव नहीं करता है - इसके बजाय प्रोग्राम स्मृति को हटाने की कोशिश करते समय बस क्रैश हो जाता है। – sharptooth
आप std :: auto_ptr –