2012-09-07 14 views
25

मैं के माध्यम से देख किया गया है और दृश्य स्टूडियो में की सी ++ 11 विभिन्न सुविधाओं के साथ खेल रहा है, विशेष रूप से 2010कूड़ा संग्रह सी ++ 11

उल्लेख चीज़ों में से एक minimal garbage collection है:

के अनुसार यह blog post, वीसी 10 इस सुविधा का समर्थन करता है।

मेरे परीक्षण बताते हैं कि विनाशक को खोने वाली वस्तुओं पर नहीं बुलाया जाता है, इसलिए मुझे यकीन नहीं है कि उनकी स्मृति स्थान मुक्त हो गई है या वे लीक हो रही हैं या नहीं।

मेरे पास इसका कोई इरादा नहीं है, किसी भी माध्यम से, लेकिन इसके व्यवहार पर सीधा, निश्चित उत्तर नहीं मिला।

उत्तर

36

न्यूनतम जीसी समर्थन (एन 2670) का मतलब केवल std::declare_reachable जैसे कार्यों को शामिल किया गया है, और परिभाषित किया गया है कि "सुरक्षित रूप से व्युत्पन्न सूचक" का अर्थ क्या है, इसलिए XOR-ing सूचक मान जैसे कुछ संचालन अपरिभाषित व्यवहार और जीसी डॉन बन जाते हैं इसके बारे में चिंता करने की ज़रूरत नहीं है। Bjarne Stroustrup's C++11 FAQ on the GC ABI, और n2585: Minimal Support for Garbage Collection and Reachability-Based Leak Detection भी देखें।

प्रस्ताव सी ++ 11 के ढांचे के भीतर एक जीसी लागू करने की अनुमति देता है। लेकिन प्रस्ताव का मतलब यह नहीं है कि जीसी का समर्थन करने के लिए कार्यान्वयन की जरूरत है। कुछ लाइब्रेरी उदा। libC++ लाइब्रेरी फ़ंक्शंस को नो-ऑप के रूप में कार्यान्वित करता है।

मुझे यकीन है कि इस बिंदु पर, आपके मामले में स्मृति बस लीक हो गई है। लेकिन ध्यान दें कि जब जीसी होता है तो विनाशक को चलाने की आवश्यकता नहीं होती है। मान लिया जाये कि "§3.8 जीवनकाल वस्तु" भी जीसी एड संकेत करने के लिए आपूर्ति, हम (§3.8/4) है:

... एक गैर तुच्छ नाशक के साथ एक कक्षा प्रकार का ऑब्जेक्ट, कार्यक्रम के लिए ऑब्जेक्ट पर कब्जा कर लिया गया भंडारण से पहले स्पष्ट रूप से विनाशक को कॉल करने की आवश्यकता नहीं है या जारी किया गया है; हालांकि, अगर विनाशक को कोई स्पष्ट कॉल नहीं है या यदि भंडारण को जारी करने के लिए डिलीट-एक्सप्रेशन (5.3.5) का उपयोग नहीं किया जाता है, तो विनाशक को पूरी तरह से बुलाया नहीं जाएगा और कोई भी प्रोग्राम जो विनाशक द्वारा उत्पादित दुष्प्रभावों पर निर्भर करता है अपरिभाषित व्यवहार है।

तो यह भी संभव है कि स्मृति को पहले से ही विनाशक के बिना मुक्त कर दिया गया हो। वास्तव में, इस तरह के n2310: Transparent Programmer-Directed Garbage Collection for C++ के रूप में पहले जीसी प्रस्तावों को स्पष्ट रूप से कहा गया है कि (n2310 §7)

जब एक वस्तु कचरा कलेक्टर द्वारा पुनर्नवीनीकरण है, इसकी नाशक लागू नहीं किया गया है ( बेशक, स्पष्ट विलोपन हमेशा विनाशकर्ता invokes)।

+0

उत्तर के लिए धन्यवाद! –

+0

जैसा कि मैं इसे समझता हूं, 3.8/4 एक "प्रोग्राम" के बारे में बात करने वाला एक अनुभाग है, जिसे विनाशक को कॉल करने की आवश्यकता नहीं है। दूसरे शब्दों में, हमें 'foo-> ~ MyClass() कहने की आवश्यकता नहीं है; foo हटाएं; '। जीसी मामले में यह मानना ​​उचित होगा कि जीसी चलाना 'हटाएं' अभिव्यक्ति का उपयोग करने जैसा था - इस मामले में जीसी विनाशक को बुलावा देने के लिए जिम्मेदार है। – Eponymous