हाँ।
एकमात्र "नुकसान" यह कर सकता है कि आपके कार्यक्रम में अक्षमता (एक अनावश्यक स्टोर ऑपरेशन) शुरू करना है - लेकिन यह ओवरहेड ज्यादातर मामलों में स्मृति के ब्लॉक को आवंटित करने और मुक्त करने की लागत के संबंध में नगण्य होगा।
आप यह मत करो, तो आप होगा कुछ बुरा सूचक derefernce कीड़े एक दिन की है।
मैं हमेशा हटाने के लिए मैक्रो का उपयोग करता हूं:
#define SAFEDELETE(ptr) { delete(ptr); ptr = NULL; }
(और एक सरणी के लिए समान, मुफ्त (), हैंडल जारी करना)
आप "सेल्फ डिलीट" तरीके भी लिख सकते हैं जो कॉलिंग कोड के पॉइंटर का संदर्भ लेते हैं, इसलिए वे कॉल कोड के पॉइंटर को NULL को बाध्य करते हैं। उदाहरण के लिए, कई वस्तुओं का उप योग हटाने के लिए:
static void TreeItem::DeleteSubtree(TreeItem *&rootObject)
{
if (rootObject == NULL)
return;
rootObject->UnlinkFromParent();
for (int i = 0; i < numChildren)
DeleteSubtree(rootObject->child[i]);
delete rootObject;
rootObject = NULL;
}
संपादित करें
हां, ये तकनीक मैक्रोज़ के उपयोग के बारे में कुछ नियमों का उल्लंघन करती है (और हाँ, इन दिनों आप शायद टेम्पलेट के साथ एक ही परिणाम प्राप्त कर सकते हैं) - लेकिन कई वर्षों से उपयोग करके मैंने कभी भी मृत स्मृति तक नहीं पहुँचा - सबसे कम और सबसे मुश्किल में से एक अधिकांश समय डिबग समस्याओं का सामना करना पड़ सकता है। कई वर्षों में व्यावहारिक रूप से उन्होंने हर टीम से बगों के एक पूर्ण वर्ग को प्रभावी रूप से समाप्त कर दिया है जो मैंने उन्हें पेश किया है।
ऐसे कई तरीके भी हैं जिन्हें आप ऊपर लागू कर सकते हैं - मैं सिर्फ लोगों को एक सूचक को हटाने के लिए मजबूर करने के विचार को चित्रित करने की कोशिश कर रहा हूं, यदि वे किसी ऑब्जेक्ट को हटाते हैं, बल्कि उनके लिए एक साधन प्रदान करने की बजाय मेमोरी को खाली करने के लिए नहीं करते हैं जो कॉल करने वाले के सूचक को पूरा नहीं करता है ।
बेशक, उपरोक्त उदाहरण एक ऑटो-पॉइंटर की ओर एक कदम है। जो मैंने सुझाव नहीं दिया क्योंकि ओपी विशेष रूप से ऑटो पॉइंटर का उपयोग न करने के मामले के बारे में पूछ रहा था।
delete
एक शून्य सूचक के लिए सुरक्षित है , हालांकि, जो एक संकेतक को शून्य करने का एक कारण अच्छा हो सकता है।