तुच्छ मामला जो आप दिखाते हैं, वह संकलन समय पर पता लगाया जा सकता है, क्योंकि वस्तु की तात्कालिकता और विनाश एक ही दायरे में हैं। सामान्य तौर पर, विलोपन समान दायरे में नहीं है, या यहां तक कि एक ही स्रोत फ़ाइल, तात्कालिकता के रूप में। और C ++ पॉइंटर का प्रकार इस बारे में जानकारी नहीं रखता है कि क्या यह अपने प्रकार की एक वस्तु या एक सरणी का संदर्भ देता है, अकेले आवंटन योजना को दें। इसलिए सामान्य रूप से संकलन समय पर इसका निदान करना संभव नहीं है।
क्यों संभव नहीं है कि विशेष मामलों का निदान करें?
C ++ में पहले से ही डायनेमिक संसाधनों के रिसाव से निपटने के लिए उपकरण मौजूद हैं, जो स्कोप्स, यानी स्मार्ट पॉइंटर्स और उच्च स्तरीय सरणियों ( std::vector
) से जुड़े हैं।
यहां तक कि अगर आप सही delete
स्वाद का उपयोग करते हैं , तो भी आपका कोड अभी भी सुरक्षित नहीं है। यदि डायनामिक एग्जिट द्वारा कोड new[]
और delete[]
टर्मिनेट किया जाता है, तो विलोपन कभी भी निष्पादित नहीं होता है।
जहाँ तक रन-टाइम डिटेक्शन जाता है, Valgrind
टूल रन-टाइम पर इसका पता लगाने का अच्छा काम करता है। घड़ी:
==26781== Command: ./a.out
==26781==
==26781== Mismatched free() / delete / delete []
==26781== at 0x402ACFC: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==26781== by 0x8048498: main (in /home/kaz/test/a.out)
==26781== Address 0x4324028 is 0 bytes inside a block of size 80 alloc'd
==26781== at 0x402B454: operator new[](unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==26781== by 0x8048488: main (in /home/kaz/test/a.out)
बेशक, Valgrind सभी प्लेटफार्मों पर नहीं चलता है, और यह उपकरण के तहत सभी रन-टाइम स्थितियों को पुन: पेश करने के लिए हमेशा व्यावहारिक या संभव नहीं है।