क्या अभी भी c ++ 0x में nullptr हटाना सुरक्षित है?


84

इसमें c++03यह स्पष्ट है कि अशक्त सूचक को हटाने का कोई प्रभाव नहीं है। वास्तव में, यह स्पष्ट रूप से कहा गया §5.3.5/2है:

या तो विकल्प में, यदि डिलीट के ऑपरेंड का मूल्य शून्य पॉइंटर है, तो ऑपरेशन का कोई प्रभाव नहीं पड़ता है।

हालांकि, इस वाक्य के लिए मौजूदा मसौदे मेंc++0x गायब है। ड्राफ्ट के बाकी हिस्सों में मैं केवल यह बता सकता हूं कि यदि डिलीट-एक्सप्रेशन का संचालक अशक्त सूचक स्थिर नहीं है तो क्या होता है। क्या अशक्त पॉइंटर को हटाना अभी भी परिभाषित है c++0x, और यदि हां, तो कहां?

टिप्पणियाँ:

यह सुझाव देने के लिए महत्वपूर्ण परिस्थितिजन्य साक्ष्य हैं कि यह अभी भी अच्छी तरह से परिभाषित है।

पहले, §5.3.5/2यह बताते हुए कि दो वाक्य हैं

पहले विकल्प (डिलीट ऑब्जेक्ट) में, डिलीट के ऑपरेंड का मूल्य एक शून्य पॉइंटर मान हो सकता है, ...

तथा

दूसरे विकल्प (डिलीट अरेंज) में, डिलीट के ऑपरेंड का मूल्य एक शून्य पॉइंटर मान या ...

ये कहते हैं कि ओपेरा को शून्य होने की अनुमति है, लेकिन अपने दम पर यह वास्तव में परिभाषित नहीं करता है कि क्या होता है।

दूसरा, इसका अर्थ delete 0बदलना एक बड़ा ब्रेकिंग परिवर्तन है, और मानक समिति इस विशेष बदलाव को बहुत कम संभावना नहीं होगी। इसके अलावा c++0xमसौदे की संगतता अनुलग्नक (अनुलग्नक सी) में इसे तोड़ने का कोई बदलाव नहीं है । अनुलग्नक C हालांकि एक सूचनात्मक अनुभाग है, इसलिए इसका कोई असर नहीं है मानक की व्याख्या।

दूसरी ओर, यह तथ्य कि अशक्त सूचक को हटाने के लिए कोई प्रभाव नहीं पड़ता है, इसका अर्थ है कि अतिरिक्त रन-टाइम चेक। बहुत सारे कोड में ऑपरेंड कभी भी शून्य नहीं हो सकता है, इसलिए यह रनटाइम चेक शून्य ओवरहेड सिद्धांत के साथ संघर्ष में है। हो सकता है कि समिति ने भाषा के घोषित डिज़ाइन लक्ष्यों के अनुरूप मानक c ++ अधिक लाने के लिए व्यवहार को बदलने का निर्णय लिया।

जवाबों:


101

5.3.5 / 7 कहते हैं:

यदि डिलीट-एक्सप्रेशन के ऑपरेंड का मान एक शून्य पॉइंटर वैल्यू नहीं है, तो डिलीट-एक्सप्रेशन एक डीलक्लबेशन फ़ंक्शन (3.7.4.2) को कॉल करेगा। अन्यथा, यह अनिर्दिष्ट whether एड है कि डील्लोकेशन फ़ंक्शन को कहा जाएगा या नहीं।

और 3.7.4.2/3 कहता है:

Of आरएसटी तर्क का मूल्य जो एक डिक्लोकेशन फ़ंक्शन को आपूर्ति किया जाता है, एक अशक्त सूचक मान हो सकता है; यदि ऐसा है, और यदि डीलक्लोलेशन फ़ंक्शन मानक लाइब्रेरी में आपूर्ति की जाती है, तो कॉल का कोई प्रभाव नहीं पड़ता है।

इसलिए व्यवहार को अच्छी तरह से परिभाषित किया गया है, जब तक कि मानक डील्लोकेशन फ़ंक्शन का उपयोग किया जाता है, या उपयोगकर्ता द्वारा प्रदान किए गए डीलक्लोवल फ़ंक्शन सही ढंग से अशक्त बिंदुओं को संभालता है।


9
चूंकि C ++ 14 "यदि अभिव्यक्ति एक अशक्त सूचक मान का मूल्यांकन करती है, तो कोई भी विध्वंसक नहीं कहा जाता है, और डील-डौल फ़ंक्शन को नहीं कहा जाता है।"
वार्मर

2
@ मुझे लगता है कि पेज सही नहीं है। C ++ 14 मानक अभी भी कहता है "यह अनिर्दिष्ट है the एड कि डील्टरलोकेशन फ़ंक्शन को" कहा जाएगा "जब सूचक शून्य है (5.3.5 / 7)।
अंतरजामी

1
एक तरफ के रूप में, नल फ़ाइल पॉइंटर के लिए फ़ेकोज़ () को कॉल करना सुरक्षित नहीं है । उबंटू (और शायद अन्य ऑपरेटिंग सिस्टम) पर, fclose (NULL) एक विभाजन दोष का कारण बनता है।
Gerry Beauregard

7

दूसरी ओर, यह तथ्य कि अशक्त सूचक को हटाने के लिए कोई प्रभाव नहीं पड़ता है, इसका अर्थ है कि अतिरिक्त रन-टाइम चेक।

नया शब्द एक नल सूचक के लिए रन-टाइम चेक को नहीं हटाता है। अन्य तरीके के आसपास: मसौदा मानक यह कहने के लिए और भी करीब आता है कि एक कार्यान्वयन को अनिवार्य होने के लिए अशक्त सूचक परीक्षण करना चाहिए।

यह भी उल्लेखनीय है: पुराने मानक ने खुद में विरोधाभास किया है जिसमें उसने कहा है (5.3.5 / 2) कि "यदि डिलीट के ऑपरेंड का मूल्य शून्य पॉइंटर है तो ऑपरेशन पर कोई प्रभाव नहीं पड़ता है" लेकिन बाद में कहा कि (5.3.5 / 7) "डिलीट-एक्सप्रेशन एक डीलक्लबेशन फ़ंक्शन को कॉल करेगा।" किसी फ़ंक्शन को कॉल करना एक प्रभाव है। यह विशेष रूप से इसलिए है क्योंकि फ़ंक्शन जिसे कहा जाता है वह अच्छी तरह से ओवरराइड हो सकता है operator delete

नया शब्द उस विरोधाभास को हटा देता है, स्पष्ट रूप से इसे लागू करने के लिए छोड़ देता है कि क्या शून्य सूचक को हटाने के मामले में डील्लोकेशन फ़ंक्शन को बुलाया जाता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.