2015-05-18 4 views
11

मैं कक्षा valgrind का उपयोग कर संकेत के साथ किसी भी मेमोरी लीक संभावना के लिए जाँच कर रहा हूँ और पता चला निम्नलिखित कार्यक्रम कोई स्मृति लीक है:क्या घोषणा के साथ मेमोरी लीक संभव है (नया any_type())?

#include <iostream> 
#include <utility> 
#include <memory> 

using namespace std; 

class base{}; 

int main() 
{ 
    unique_ptr<base> b1 = make_unique<base>(); 
    base *b2 = new base(); 
    cout << is_same<decltype(new base()), decltype(b1)>::value << endl; 
    cout << is_same<decltype(new base()), decltype(b2)>::value << endl; 
    delete b2; 
    return 0; 
} 

यह कैसे संभव हो सकता है?

उत्तर

16

decltype (और sizeof) का संचालन मूल्यांकन नहीं किया जाता है, इसलिए स्मृति आवंटन सहित कोई साइड इफेक्ट नहीं होगा। संकलन-समय पर केवल प्रकार निर्धारित किया जाता है।

तो यहां केवल स्मृति स्मृति आवंटन make_unique और पहले new base() में हैं। पूर्व को unique_ptr विनाशक द्वारा हटा दिया गया है, बाद में delete b2 द्वारा, कोई रिसाव नहीं छोड़ा गया है।

+2

इसका एक विशेष रूप से दिलचस्प परिणाम [std :: declval] (http://en.cppreference.com/w/cpp/utility/declval) जैसे कार्यों है जो विशेष रूप से अभिव्यक्तियों के इस प्रकार में उपयोग के लिए हैं, उदाहरण के लिए 'decltype (std :: declval ()। विधि()) ', और वास्तव में वास्तव में कहीं भी परिभाषित नहीं किया जाता है। – cartographer

8

decltype एक अभिव्यक्ति के प्रकार से पूछताछ करने के लिए उपयोग किया जाने वाला एक कीवर्ड है। यह सिर्फ अभिव्यक्ति के प्रकार का विश्लेषण करता है; यह वास्तव में यह प्रदर्शन नहीं करता है।

तो, न केवल यह रिसाव होगा, आप decltype बिना किसी त्रुटि के वर्ग रूट -1 कर सकते हैं, और इसी तरह।

2

क्योंकि decltype और टेम्पलेट हैंडलिंग (प्रकार-विशेषता कक्षाओं की तरह) संकलन समय केवल संकलित है। रन-टाइम में वास्तव में कुछ भी नहीं होता है।

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