साथ ही निर्माता या शुद्ध आभासी कार्यों के साथ एक वस्तु का नाशक आप भी एक शुद्ध आभासी समारोह कॉल प्राप्त कर सकते हैं से एक आभासी समारोह बुलाने की मानक मामले (MSVC पर कम से कम) यदि आप एक आभासी फोन वस्तु नष्ट हो जाने के बाद समारोह। जाहिर है यह कोशिश करने और करने के लिए एक बहुत ही बुरी चीज है, लेकिन यदि आप अमूर्त वर्गों के साथ इंटरफेस के रूप में काम कर रहे हैं और आप गड़बड़ कर रहे हैं तो यह कुछ ऐसा है जो आप देख सकते हैं। यदि आप संदर्भित गिनती इंटरफेस का उपयोग कर रहे हैं तो संभवतः अधिक संभावना है और आपके पास एक गिनती बग है या यदि आपके पास बहु-थ्रेडेड प्रोग्राम में ऑब्जेक्ट का उपयोग/ऑब्जेक्ट विनाश दौड़ की स्थिति है ... इस प्रकार के purecall के बारे में बात यह है कि यह है सीटीओआर और डाटर में आभासी कॉल के 'सामान्य संदिग्ध' के लिए चेक के रूप में क्या हो रहा है, यह जानने के लिए अक्सर कम आसान होता है।
एमएसवीसी के विभिन्न संस्करणों में, आप इस प्रकार की समस्याओं को डीबग करने में मदद के लिए रनटाइम लाइब्रेरी के शुद्धकॉल हैंडलर को प्रतिस्थापित कर सकते हैं। आप इस हस्ताक्षर के साथ अपना स्वयं का फ़ंक्शन प्रदान करके ऐसा करते हैं:
int __cdecl _purecall(void)
और रनटाइम लाइब्रेरी को लिंक करने से पहले इसे लिंक करना। यह आपको शुद्ध करता है जब एक शुद्धकॉल का पता चला है तो क्या होता है। एक बार आपके नियंत्रण होने के बाद आप मानक हैंडलर से कुछ और उपयोगी कर सकते हैं। मेरे पास एक हैंडलर है जो कि पर्सकॉल कहां से एक स्टैक ट्रेस प्रदान कर सकता है; अधिक जानकारी के लिए यहां देखें: http://www.lenholgate.com/blog/2006/01/purecall.html।
(ध्यान दें कि आप एमएसवीसी के कुछ संस्करणों में अपने हैंडलर को स्थापित करने के लिए _set_purecall_handler() को भी कॉल कर सकते हैं)।
स्रोत
2008-09-19 08:48:40
किसी भी कारण से संकलक इसे सामान्य रूप से पकड़ नहीं सकता था? – Thomas
मुझे कोई तकनीकी कारण नहीं दिख रहा है कि संकलक इसे क्यों नहीं पकड़ सका। –
जीसीसी मुझे केवल एक चेतावनी देता है: test.cpp: कन्स्ट्रक्टर 'बेस :: बेस()': test.cpp: 4: चेतावनी: कन्स्ट्रक्टर से बुलाया गया सार वर्चुअल वर्चुअल वर्चुअल शून्य बेस :: doIt() लेकिन यह लिंक समय पर विफल रहता है। – Thomas