2010-07-02 16 views
11

मुझे हाल ही में एक साक्षात्कार में यह पूछा गया था, मूल रूप से नि: शुल्क कार्यक्षमता को जोड़कर और शून्य को असाइन करने के लिए एक फ़ंक्शन लिखना। मैं निम्नलिखित तरीके से उत्तर दिया:एक पॉइंटर को मुक्त करने के लिए एक फ़ंक्शन लिखना और इसे असाइन करना NULL

void main() 
{ 
     int *ptr; 
     ptr = new int; 
     ptr = newdelete(ptr); 
} 

(int*) newdelete (int *ptr) 
{ 
     delete(ptr); 
     return NULL; 
} 

तो निष्पादन के बाद, ptrmain करने के लिए स्थानीय शून्य मान का आयोजन करेगा के रूप में मैं इसे newdelete समारोह से लौट रहे हूँ। अगर मैंने नए डिलीट फ़ंक्शन में NULL असाइन किया था, तो ptr स्थानीय से newdelete को हटा दिया जाएगा और ptr स्थानीय main पर नहीं होगा।

मुझे लगता है कि मेरा समाधान सही था, साक्षात्कारकर्ता ने इसे भी स्वीकार कर लिया। हालांकि, वह कुछ अन्य जवाब की उम्मीद कर रहा था। वह जोर दे रहा था कि मैं समारोह से NULL वापस नहीं करता हूं और अभी भी वांछित परिणाम प्राप्त करता हूं।

क्या इसे पूरा करने का कोई तरीका है? मैं सोच सकता हूं कि एक और तर्क पारित कर रहा है जो पॉइंटर ptr को स्थानीय main पर पॉइंटर है, लेकिन मुझे नहीं लगता कि यह मेरे द्वारा किए गए कार्यों से बेहतर क्यों है!

+0

मुझे लगता है कि आपका मतलब 'नया int' था क्योंकि 'नया' परिभाषित 'सी ++' ऑपरेटर नहीं है। – ereOn

+1

सूचक के लिए एक संदर्भ पास करें। –

+0

http://stackoverflow.com/questions/1265666/reason-why-not-to-have-a-delete-macro-for-c/1265681#1265681 – Goz

उत्तर

36

क्या इसे पूरा करने का कोई तरीका है ??

template <typename T> void safeDelete(T*& p){ 
    delete p; 
    p = 0; 
} 

int main(int argc, char** arv){ 
    int * i = new int; 
    safeDelete(i); 
    return 0; 
} 
+0

+1, सबसे सीधा-आगे और लचीला समाधान। – stinky472

+4

चूंकि केवल कोड ही है, यही कारण है कि यह एक बेहतर समाधान है कि आप गारंटी देते हैं कि कॉल के दौरान पॉइंटर को हटा दिया जाएगा। प्रश्न में कोड के साथ आप वापसी मूल्य को भूल सकते हैं (भूल सकते हैं): '/ * p = */newdelete (p); 'और स्मृति मुक्त हो जाएगी लेकिन सूचक शून्य नहीं होगा। –

+6

ध्यान रखें कि आपको सरणी के लिए इसका दूसरा संस्करण चाहिए। –

8

मुझे लगता है कि वह कुछ ऐसा उम्मीद कर रहा था:

void reset(int*& ptr) 
{ 
     delete(ptr); 
     ptr = NULL; 
} 

एक भी सफाई घोल का उपयोग करने गया होता एक boost::shared_ptr<> और बस ptr.reset() कॉल करने के लिए। हालांकि, मुझे लगता है कि यह एक विकल्प नहीं था।

+1

क्या होगा अगर वे साझा पॉइंटर अर्थशास्त्र नहीं चाहते हैं? यदि आपको इसकी आवश्यकता नहीं है तो उस अतिरिक्त ओवरहेड को कोई बिंदु नहीं है। –

+1

@ पीटर scoped_ptr उस मामले में जो रीसेट प्रदान करता है। – stinky472

+0

@ पीटर: मुझे 'shared_ptr' के बजाय 'scoped_ptr' का उल्लेख करना चाहिए था (मैं बाद में अक्सर उपयोग करता हूं इसलिए यह मेरे दिमाग में पहले आया था)। चाहे इसे साझा किया गया हो या स्कॉप्ड किया गया हो, एक स्मार्ट पॉइंटर का उपयोग कच्चे पॉइंटर्स के साथ संयुक्त 'सुरक्षित डेल्टे()' फ़ंक्शन से सुरक्षित है। – ereOn

1

तो requrement एक समारोह लिखने के लिए नहीं था, तो आप हमेशा एक ऐसा मैक्रो के साथ-साथ यह तुम्हारे लिए क्या होगा लिख ​​सकते हैं:,

#define my_delete(x) { delete x; x = NULL; } 
बेशक

इसे इस तरह बुला आप सभी प्रकार में मिल जाएगा परेशानी का:

my_delete(ptr++) 

तो, मुझे लगता है कि मैं गैर-मैक्रो तरीका पसंद करता हूं।

1

आप नहीं

आप auto_ptr, shared_ptr है जो अपने आप nulls की तरह स्मार्ट सूचक का उपयोग करते हैं।

संबंधित मुद्दे