2016-03-23 7 views
14

मेरा एमएसवीसी 12 संकलक ऐसा क्यों नहीं करता है?सी ++ विनाशक एक डिलीट ऑपरेटर को कॉल करता है?

त्रुटि 2 त्रुटि C2280:

#include <new> 

class thing 
{ 
public: 
    thing() {} 
    ~thing() {} 
    static void operator delete(void* ptr) = delete; 
}; 

int main() 
{ 
    int g; 
    void* p = &g; 
    thing* t1 = new(p) thing(); 
    t1->~thing(); 

    return 0; 
} 

त्रुटि मैं मुख्य() के समापन ब्रेस पर अजीब तरह से है '(शून्य *) शून्य बात :: ऑपरेटर को नष्ट': किसी हटाए गए समारोह को संदर्भित करने का प्रयास

यदि मैं स्पष्ट विनाशक कॉल पर टिप्पणी करता हूं, तो त्रुटि दूर हो जाती है, जिसका अर्थ यह है कि स्पष्ट विनाशक कॉल ऑपरेटर को हटाने (शून्य *) को कॉल करने का प्रयास कर रहा है। यह सहज ज्ञान नहीं देता है। जैसा कि आप शायद यहां कोड से देख सकते हैं, मैंने पहले ही अपनी याददाश्त प्रबंधित की है, और मैं नहीं चाहता कि किसी को भी चीज़ पर हटाना पड़े।

+1

यह [compiles और works] (http://coliru.stacked-crooked.com/a/b0c0ca91f45c3887) gcc5 में, जैसा कि करना चाहिए। यदि आप रिलीज मोड में संकलित करते हैं तो क्या होता है? – vsoftco

+1

[cpp.sh/3mqd ](http://cpp.sh/3mqd) - gcc ठीक काम करता है –

+0

रिलीज बिल्ड में एक ही त्रुटि है। ऐसा लगता है कि यह एक कंपाइलर बग है? – Kumputer

उत्तर

5

यह निश्चित रूप से एक बग है क्योंकि वर्चुअल कॉल को केवल गैर-वर्चुअल एक के साथ विनाशक को बदलकर: t1->thing::~thing() यह काम करता है। लेकिन जाहिर है इस मामले में कोई विरासत शामिल नहीं है और इसलिए दोनों रूपों के बीच कोई अंतर नहीं है।

आप कोशिश करते हैं और इस सूत्र में आम सहमति के माध्यम से the Microsoft Connect site for VS

+0

https://connect.microsoft.com/VisualStudio/Feedback/Details/2511044 – Kumputer

+0

विनाशक वर्चुअल नहीं है –

+0

यह नहीं है, लेकिन स्पष्ट विधि नाम का उपयोग करने वाला एक कॉल गैर-वर्चुअल कॉल कहा जाता है। –

3

बग प्रस्तुत कर सकते हैं कि यह एक संकलक बग MSVC को ++ अद्वितीय है। मैं माइक्रोसॉफ्ट यहाँ को यह सूचना दी है:

https://connect.microsoft.com/VisualStudio/Feedback/Details/2511044

अद्यतन: एमएस की रिपोर्ट है कि समस्या का समाधान हो और अगले वी.एस. अद्यतन में उपलब्ध हो जाएगा।

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