2009-04-16 1 views
8

मैं इस प्रश्न को Deleting a const pointer पढ़ रहा था और delete व्यवहार के बारे में अधिक जानना चाहता था। अब, मेरी समझ के अनुसार:पॉइंटर स्थिरता के साथ सौदा कैसे हटाता है?

दो चरणों में

delete expression काम करता है:

  1. आह्वान नाशक
  2. तो स्मृति (अक्सर free() के लिए एक कॉल के साथ) ऑपरेटर को नष्ट फोन करके विज्ञप्ति।

operator deletevoid* स्वीकार करता है। एक परीक्षण कार्यक्रम के हिस्से के रूप में मैंने operator delete अधिभारित किया और पाया कि operator deleteconst पॉइंटर स्वीकार नहीं करता है।

चूंकि ऑपरेटर डिलीट कॉन्स्ट पॉइंटर स्वीकार नहीं करता है और आंतरिक कॉल ऑपरेटर को हटा देता है, Deleting a const pointer कैसे काम करता है?

क्या delete आंतरिक रूप से const_cast का उपयोग करता है?

+0

@ एजे। अच्छा प्रश्न! –

उत्तर

13

const_cast वास्तव में कुछ भी नहीं करता है - यह ऑब्जेक्ट के कॉन्स्ट-नेस के बारे में moaning कंप्रेसर दबाने का एक तरीका है। हटाएं कीवर्ड एक कंपाइलर निर्माण है, संकलक जानता है कि इस मामले में क्या करना है और पॉइंटर के कॉन्स्टेस की परवाह नहीं है।

4

this answer कहते हैं, delete किसी अन्य की तरह एक विधि नहीं है, लेकिन वस्तुओं को नष्ट करने के लिए लंगेज का एक हिस्सा नहीं है। const -नेस की विनाश पर कोई असर नहीं है।

1

delete एक ऑपरेटर है जिसे आप अधिभारित कर सकते हैं। यह एक तर्क के रूप में एक सूचक लेता है, और संभवतः free का उपयोग कर स्मृति को मुक्त करता है। संकलक यह अनुमति देता है कि सूचक const है या नहीं।

+5

यह वास्तव में सही नहीं है। ऑपरेटर 'डिलीट' (बदला नहीं जा सकता) और फ़ंक्शन' ऑपरेटर डिलीट '(जो हो सकता है) के बीच एक बढ़िया लेकिन महत्वपूर्ण भेद होना चाहिए।पूर्व उत्तरार्द्ध को बुलाता है लेकिन वे * समान * नहीं होते हैं। –

+0

@ कोनराड रुडॉल्फ, हाँ, यह सच है, लेकिन इससे कोई फर्क नहीं पड़ता है। – Zifre

2

ऑपरेटर हटाएं एक शून्य * स्वीकार करता है। एक परीक्षण कार्यक्रम के हिस्से के रूप में मैंने ओवरलोडेड ऑपरेटर को हटा दिया और पाया कि ऑपरेटर डिलीट कॉन्स्ट पॉइंटर स्वीकार नहीं करता है।

आपने यह कैसे प्रयास किया?

#include <memory> 

int main() { 
    void* const px = 0; 
    delete px; 
    ::operator delete(px); 
} 

इस कोड सही है, compiles (एक उचित चेतावनी के साथ यद्यपि) और कार्यान्वित: यह निश्चित रूप से स्थिरांक संकेत को स्वीकार करता है।

संपादित: मूल लेख पढ़ना - यदि आप एक स्थिरांक सूचक लेकिन एक सूचक const है, जो कुछ और है के बारे में बात नहीं कर रहे हैं। इसका कारण यह है कि इसका वर्णन क्यों किया गया है। यह क्यों काम कर रहा है: दूसरों ने यह कहा है।

-1

delete सिर्फ पॉइंटर पॉइंट्स को स्मृति को डिलीकेट करने के लिए कॉल करता है, यह पॉइंटर और न ही ऑब्जेक्ट का मान नहीं बदलता है। इसलिए, delete के पास const-पॉइंटर या ऑब्जेक्ट की ओर इशारा करते हुए कुछ भी नहीं है।

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

  • कोई संबंधित समस्या नहीं^_^