28

मुझे पता है कि delete एक अशक्त सूचक ing नो-सेशन है:क्या यह एक शून्य शून्य * सूचक को हटाने के लिए अपरिभाषित व्यवहार है?

या तो वैकल्पिक रूप से, अगर हटाने की संकार्य के मूल्य में नल पॉइंटर आपरेशन कोई प्रभाव नहीं है है।
(सी ++ स्टैंडर्ड 5.3.5 [expr.delete] p2)

और यह भी है कि एक void* सूचक को हटाने अपरिभाषित व्यवहार क्योंकि वहाँ के रूप में प्रकार void का कोई वस्तुओं रहे हैं नाशक नहीं कहा जा सकता है: में

पहला विकल्प (delete object), हटाए जाने के संचालन का मूल्य एक गैर-सरणी ऑब्जेक्ट के लिए एक सूचक या ऐसी ऑब्जेक्ट की बेस क्लास का प्रतिनिधित्व करने वाले उप-ऑब्जेक्ट के पॉइंटर होगा। यदि नहीं, तो व्यवहार अपरिभाषित है।
(सी ++ स्टैंडर्ड 5.3.5 [expr.delete] p2)

अब, सामान्य रूप से मैं इसे ले कि चीजें हैं जो पहले चीजें हैं जो बाद में सूचीबद्ध हैं, लेकिन के बारे में निम्नलिखित के रूप में अशक्त void* सूचक क्या निष्प्रभावी सूचीबद्ध हैं?

void* p = 0; 
delete p; // UB or well-defined? 
+0

मैं इस प्रकार के बावजूद "एक पूर्ण सूचक को हटाने" में गिरने के एक अच्छी तरह से परिभाषित व्यवहार की अपेक्षा करता हूं। वास्तविक मुक्त करने और विनाशक को बुलाकर आदर्श रूप से न्यूल के लिए चेक का पालन करना चाहिए। – hackworks

+0

अंडे या चिकन ?? –

+0

जी ++ पर मुझे चेतावनी मिलती है 'हटाना' शून्य * 'अपरिभाषित है'। मुझे लगता है कि इसकी यूबी (100% निश्चित नहीं)। –

उत्तर

12

मुझे आश्चर्य है कि कैसे आप एक स्थिति है जहाँ आप एक सूचक हटा रहे हैं तक पहुंच सकता है केवल अगर यह शून्य है। लेकिन भाषा lawyering मोड में रह ...

में सी ++ 03

5.3.5/1

हटाने की संकार्य एक सूचक प्रकार या एक वर्ग एक के लिए एक एकल रूपांतरण होने प्रकार होगा सूचक प्रकार।

शून्य * एक सूचक प्रकार है इसलिए एक शून्य शून्य सूचक स्थिर आवश्यकता को पूरा करता है।

5.3.5/2

में या तो विकल्प [delete और delete[]], अगर हटाने की संकार्य का मान शून्य सूचक है आपरेशन कोई प्रभाव नहीं है।

और यह वांछित व्यवहार देता है।

5.3.5/3

पहले विकल्प में (वस्तु हटाना), अगर संकार्य के स्थिर प्रकार की गतिशील प्रकार से अलग है, स्थिर प्रकार संकार्य की गतिशील का एक आधार वर्ग होगा प्रकार और स्थिर प्रकार में एक आभासी विनाशक होगा या व्यवहार अपरिभाषित है।

यह प्रासंगिक नहीं है, एक शून्य सूचक किसी ऑब्जेक्ट का संदर्भ नहीं देता है जिस पर अतिरिक्त बाधा जांचना है।

C++ 0x में

5.3.5/1

संकार्य के लिए एक कक्षा में एक भी गैर स्पष्ट रूपांतरण समारोह (12.3.2) होने प्रकार प्रकार आपत्ति उठाने का एक सूचक अथवा होगा ऑब्जेक्ट प्रकार के लिए एक सूचक।

शून्य * ऑब्जेक्ट प्रकार के लिए सूचक नहीं है, इसलिए इसे खारिज कर दिया जाना चाहिए।

+1

यह जानना दिलचस्प है कि यह अब C++ 0x में काम नहीं करेगा। :) – Xeo

+0

इसके अलावा, ध्यान दें, शीर्ष पर आपका मानना ​​बिल्कुल सही नहीं है: यदि मैं चाहता हूं तो मैं केवल शून्य 'शून्य * 'सूचक को सशर्त रूप से हटा दूंगा। ;) किसी अन्य स्थिति में, मैं एक वैध वस्तु को हटा दूंगा। – Xeo

+0

कुछ ऐसा [यह] (http://ideone.com/zQLAQ) जैसा है। डिफ़ॉल्ट कन्स्ट्रक्टर देखें, मैं वैध '_delete' फ़ंक्शन पॉइंटर की जांच नहीं करना चाहता, और मुझे पता था कि 'डिलीटिंग' 0' नो-ऑप है, अब एकमात्र प्रश्न था: मुझे ' erased_delete' फ़ंक्शन? :) – Xeo

2

मुझे विश्वास है कि यह अपरिभाषित व्यवहार है। new void की अनुमति नहीं है (आपको void प्रकार की वस्तुएं बनाने की अनुमति नहीं है) इसलिए delete पर void* पर कॉल करना या तो समझ में नहीं आना चाहिए। इससे कोई फर्क नहीं पड़ता कि यह NULL पर इंगित कर रहा है या नहीं। मैं अपने कोड में कहीं भी ऐसी चीज का उपयोग नहीं करूंगा।

+3

मैं इसका भी उपयोग नहीं करूँगा, यह सिर्फ एक टेम्पलेटेड डिलीटर फ़ंक्शन, ऐसे फ़ंक्शन के लिए एक फ़ंक्शन पॉइंटर और मेरे 'शून्य * के लिए डिफ़ॉल्ट मान शामिल कुछ परिस्थितियों के साथ दिमाग में आया। :) – Xeo

8

§5.3.5/3 कहते हैं,

पहले विकल्प में ( वस्तु हटाना), अगर संकार्य के स्थिर प्रकार की गतिशील प्रकार से अलग है, स्थिर प्रकार एक होगा ऑपरेटिंग के गतिशील प्रकार के आधार वर्ग और स्थिर प्रकार में वर्चुअल विनाशक होगा या व्यवहार अपरिभाषित है। दूसरा विकल्प (सरणी हटाना) वस्तु के गतिशील प्रकार इसके स्थिर प्रकार से हटा अलग होने के लिए अगर में, व्यवहार है अपरिभाषित

फुटनोट यह कहता है कि में,

73 - इसका तात्पर्य है कि किसी ऑब्जेक्ट को टाइप शून्य के सूचक का उपयोग करके हटाया नहीं जा सकता है क्योंकि टाइप प्रकार की कोई वस्तु नहीं है।

तो हाँ, इसकी यूबी।

अब एक बार यह अपरिभाषित व्यवहार के शहर में प्रवेश करती है, यह कोई बात नहीं है कि क्या उसके अशक्त या नहीं, के बाद से अपने व्यवहार कारण के लिए ठीक अच्छी तरह से परिभाषित है कि यह पहले से ही में एक निवास मिला नहीं रह सकते अपरिभाषित व्यवहार का शहर।


संपादित करें:

समझे एक अन्य विषय जो भी एक ही उद्धरण और कहते हैं अपने यूबी:

Is it safe to delete a void pointer?

+1

+1, अच्छा लिंक और संदर्भ; लेकिन हमें यह भी ध्यान में रखना चाहिए कि सूचक 0 है, तो क्या इससे नुकसान होगा? – iammilind

+1

@ नवाज: आपकी पोस्ट सिर्फ [नील बटरवर्थ की पोस्ट] का एक डुप्लिकेट है (http://stackoverflow.com/questions/941832/is-it-safe-to-delete-a-void-pointer/941959#941959) । –

+0

@ प्र्रासून: मैंने लिंक प्रदान किया है, मेरी पोस्ट में संपादन देखें। – Nawaz

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