2013-06-24 8 views
5

मैं निम्नलिखित कोड की तरह ख़ाली उपयोग कर सकते हैं:ऑपरेटर हटा सकते हैं और कास्टिंग

int main() 
{ 
    int* foo = new int; 
    double* bar = reinterpret_cast<double*>(foo); 
    delete bar; 
} 

यह यूबी है?

मुझे लगता है कि हमें केवल ऑपरेटर द्वारा लौटाए गए पॉइंटर्स के लिए ऑपरेटर को कॉल करने की आवश्यकता है, लेकिन इस मामले में कास्टिंग के बारे में क्या?

मुझे लगता है कि यह यूबी है क्योंकि reinterpret_cast परिणामी पॉइंटर के बारे में कोई गारंटी नहीं देता है। क्या मैं सही हू?

क्या कोई मानक से सही उद्धरण पोस्ट कर सकता है, कृपया?

+2

ध्यान दें कि यूबी यहां हटाए गए अभिव्यक्ति में निहित है, ऑपरेटर को हटाएं नहीं। – PlasmaHH

+0

ठीक है, तो यहां यूबी के बारे में क्या? क्या आप मानक से उद्धरण पोस्ट कर सकते हैं, कृपया? – FrozenHeart

उत्तर

6

§5.3.5/2 "पहले विकल्प में (वस्तु हटाना), का मूल्य हटाने की संकार्य एक अशक्त सूचक मूल्य, एक गैर सरणी वस्तु पिछले new- द्वारा बनाई गई करने के लिए एक सूचक हो सकता है अभिव्यक्ति, या एक उपरोक्त (1.8) के लिए एक सूचक जो किसी ऑब्जेक्ट (क्लॉज 10) की बेस क्लास का प्रतिनिधित्व करता है। यदि नहीं, तो व्यवहार अपरिभाषित है। " चूंकि bar अंक double पर इंगित करता है, यह पिछले 0 -को किसी ऑब्जेक्ट को इंगित नहीं करता है जो पिछले नई अभिव्यक्ति द्वारा बनाया गया था (जिसने int बनाया)।

+0

इस मामले में स्थिर और गतिशील प्रकार क्या है? क्रमशः – FrozenHeart

+0

'int' और' double'। लेकिन अगर मानक की शब्दावली को समझने के लिए बहुत ही गड़बड़ है, तो बस यह मान लें कि आप गलत कन्स्ट्रक्टर का आविष्कार कर रहे हैं जो आप करते हैं। उपर्युक्त उद्धरण के बिना भी यह स्पष्ट होना चाहिए। दोनों विनाशक छोटे होते हैं क्योंकि यह होता है, इसलिए यह "काम करेगा", लेकिन यह अभी भी बहुत स्पष्ट रूप से यूबी है। – Damon

+0

@ निकिताट्रोफिमोव, यहां अधिक: http://stackoverflow.com/questions/1347691/static-vs- गतिशील- टाइप- चेकिंग-in-c – chris

0

यहाँ आप कर रहे हैं:

5.3.5 बिंदु 3: पहले विकल्प (वस्तु हटाना) में, वस्तु के स्थिर प्रकार हटाए जाने के लिए अपने गतिशील प्रकार से अलग है अगर, स्थिर प्रकार हटाए जाने वाले ऑब्जेक्ट के डायनामिक प्रकार का बेस क्लास होगा और स्थिर प्रकार में वर्चुअल विनाशक होगा या व्यवहार अपरिभाषित होगा।

क्या स्थिर और गतिशील प्रकार है के प्रश्नों के लिए के रूप में:

1.3.7 गतिशील प्रकार (glvalue) सबसे व्युत्पन्न वस्तु की
प्रकार (1.8), जो करने के लिए glvalue एक glvalue से दर्शाया जाता है अभिव्यक्ति को संदर्भित करती है [उदाहरण: यदि कोई सूचक (8.3.1) पी जिसका स्थैतिक प्रकार "कक्षा बी के सूचक" है, तो बी 0 (क्लॉज 10), अभिव्यक्ति के गतिशील प्रकार से प्राप्त कक्षा डी के किसी ऑब्जेक्ट को इंगित कर रहा है * पी "डी" संदर्भ (8.3.2) का इलाज समान रूप से किया जाता है। अंत उदाहरण]

1.3.23 स्थिर प्रकार
एक अभिव्यक्ति (3.9) निष्पादन अर्थ विज्ञान पर विचार [नोट के बिना कार्यक्रम के विश्लेषण से उत्पन्न के प्रकार: एक अभिव्यक्ति के स्थिर प्रकार केवल कार्यक्रम के रूप पर निर्भर करता है जिसमें अभिव्यक्ति प्रकट होता है, और प्रोग्राम निष्पादित होने पर नहीं बदलता है। अंत टिप्पणी]

+0

भी। (वास्तव में यह पैराग्राफ मैं देख रहा था जब मुझे मेरा जवाब मिला।) –

+0

इस मामले में स्थिर और गतिशील प्रकार क्या है? – FrozenHeart

+1

स्टेटिक प्रकार पॉइंटर ('डबल') का प्रकार है। गतिशील प्रकार पॉइन्टे ('int') का प्रकार है। –

2

5.3.5-3 से:

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

reinterpret_cast का उपयोग करने में संभावित समस्याओं को छोड़कर, यह यूबी है क्योंकि प्रकार मेल नहीं खाते हैं। कुछ नॉनट्रिविअल प्रकार की कल्पना करो, फिर आप आसानी से इसे "गलत" डॉटर के रूप में देख सकते हैं।

इसके अतिरिक्त reinterpret_cast के परिणाम का उपयोग करके इसे वापस करने के अलावा किसी और चीज के लिए मानक द्वारा अनिर्दिष्ट है।

+0

इस मामले में स्थिर और गतिशील प्रकार क्या है? – FrozenHeart

+1

@NikitaTrophimov: ऑब्जेक्ट का गतिशील प्रकार int है, क्योंकि ऑब्जेक्ट को int के रूप में बनाया गया था, और अभिव्यक्ति की स्थिरता दोगुना है, क्योंकि आप उस बिंदु को उस बिंदु पर डबल के रूप में देखते हैं। – PlasmaHH

+0

आपके पास अन्य उत्तरों के लोगों की तुलना में अलग राय है :) – FrozenHeart

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