2011-11-17 13 views
5

यहाँ मैं क्या MSDN के बारे में new ऑपरेटर से कॉपी किया गया है:कार्यों के लिए पॉइंटर्स की एक सरणी हटाना?

new ऑपरेटर एक समारोह आवंटित करने के लिए नहीं किया जा सकता है, लेकिन यह हो सकता है कार्यों के लिए संकेत आवंटित करने के लिए इस्तेमाल किया। निम्नलिखित उदाहरण आवंटित करता है और उसके बाद रिटर्न पूर्णांक कार्यों के लिए सात पॉइंटर्स की एक सरणी को मुक्त करता है।

int (**p)() = new (int (*[7])()); 
delete *p; 

वैसे वहाँ पहली पंक्ति के साथ अजीब कुछ भी नहीं है, यह कार्यों के लिए संकेत की एक सरणी आबंटित करता है, लेकिन मैं तो बस समझ में नहीं आता कि कैसे दूसरे को हटा देता है कि सरणी? मुझे लगता है कि यह होना चाहिए:

delete[] *p; 

क्या कोई इसे समझा सकता है?

+0

हाँ,,,,, –

+6

नहीं, यह 'हटाएं [] पी' (कोई तारांकन नहीं) होना चाहिए। – avakar

+0

और कैसे "हटाएं * पी;" यह सही है? यही है कि मैं – codekiddy

उत्तर

5

स्पष्ट रूप से सही उत्तर बोलने से avakar की टिप्पणी में लिखा गया था। सही कोड

delete[] p; 

delete *p; दो कारणों के लिए सही नहीं है है:

  1. हम सब गतिशील आवंटित सरणियों के लिए delete[] उपयोग करना चाहिए। delete का उपयोग करना एक अपरिभाषित व्यवहार का कारण बन जाएगा।
  2. स्थिर और सदस्य कार्यों के लिए संकेत
+0

मुझे लगता है कि आपका दूसरा बिंदु अनजाने में कहा जाता है, हालांकि आप सही हैं कि' हटाएं * पी' दो खातों पर गलत है। प्वाइंटर्स को निश्चित रूप से हटाया जा सकता है, माना जाता है कि उन्हें आवंटित किया गया था। एक सूचक, आखिरकार, वह एक सूचक है। हालांकि 'हटाएं * पी' सूचक को हटा नहीं देता है, लेकिन पॉइंट-टू-फ़ंक्शन को हटाने का प्रयास करता है। – Damon

+0

हालांकि स्वीकार्य रूप से मेरा शब्द बहुत बेहतर नहीं है ... निश्चित रूप से सूचक नहीं हटाया गया है, लेकिन क्या भी इंगित किया गया है। तो शायद "हटाएं एक सूचक लेता है और * पी एक सूचक नहीं है" वह शब्द है जो सही होना चाहिए। – Damon

+0

उत्तर दिमित्री के लिए धन्यवाद, उत्तर देने के लिए दूसरों के लिए भी बड़ा धन्यवाद! – codekiddy

2

हम एक typedef जोड़ देते हैं तो हटाया नहीं जा सकता,

typedef int (*FPtr)(); 

new बयान तो यह स्पष्ट है कि के रूप में

FPtr *p = new FPtr[7]; 

लिखा जा सकता है संसाधन

के साथ जारी किया जाना चाहिए

जैसा कि दूसरों द्वारा समझाया गया है।


बीटीडब्ल्यू, वीएस 2008 के लिए एमएसडीएन पृष्ठ और ऊपर सही कोड का उपयोग करता है।

int (**p)() = new (int (*[7])()); 
delete [] p; 
+0

ऐसा इसलिए हो सकता है क्योंकि मैंने गुगलिंग द्वारा लिंक जोड़ा है, और इस प्रकार ओपी उद्धरण के मुकाबले एक अलग संस्करण से जुड़ा हुआ हो सकता है। मेरी गलती। –

+0

मैंने विजुअल स्टूडियो 2008 संस्करण से कोड कॉपी किया है: डी – codekiddy

+0

@codekiddy: यह कहता है [2008 यूएस संस्करण] में 'हटाएं []' (http://msdn.microsoft.com/en-uS/library/kewsb8ba % 28v = VS.90% 29.aspx)। – kennytm

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