2015-10-23 6 views
5

हर कोई!हटाएं [] प्रति तत्व हटाए गए बराबर है। सी ++

चलें कहते हैं कि मैं सरणी वर्ग लिख रहा हूँ और निर्माण

data = reinterpret_cast<T*>(new char[sizeof (T) * size]); 
    for (int i = 0; i < size; ++i) { 
     new(&data[i]) T(some_value); 
} 

अनुकूलित करना चाहते हैं और अब मैं कैसे सही ढंग से स्मृति को मुक्त करने के सोच रहा हूँ:

  1. delete[] data;

  2. for (int i = 0; i < size; ++i) { data_[i].~T(); }

+0

क्या आप ['std :: array'] (http://en.cppreference.com/w/cpp/container/array) को फिर से लिखने की कोशिश कर रहे हैं? – NathanOliver

+0

क्या होता है यदि आवंटित सरणी टी के लिए सही संरेखण नहीं है? –

+0

@NathanOliver, ज़ाहिर है कि मैं ऐसा करने की कोशिश नहीं कर रहा हूं :-) यह मेरी सभी उत्सुक कल्पना है। – aob

उत्तर

2

अभिव्यक्ति हटाना [] डेटा से मेल खाना चाहिए कि ढेर पर सरणी बनाया नई टी [], ताकि टी* डेटा का प्रकार है। अन्यथा कार्यक्रम का व्यवहार अपरिभाषित है (5.3.5)।

आपके उदाहरण में, डेटा और * डेटा अज्ञात है। यदि टीchar नहीं है, तो व्यवहार अपरिभाषित है।

आप नहीं कॉल [] डेटा, हटा देना चाहिए भी पाश में विनाशकर्ता बुला के बाद। अपरिभाषित व्यवहार से बचने के लिए को हटाएं [] reinterpret_cast < char * > (डेटा) पर कॉल करना बेहतर होगा। प्रकार टी के विनाशकों को स्मृति मुक्त करने से पहले बुलाया जाना चाहिए।

1

आपको डेटा को delete से पहले पहले विनाशकों को कॉल करने की आवश्यकता है।

// First step 
for (int i = 0; i < size; ++i) { 
    data_[i].~T(); 
} 

// Second step 
delete [] data; 
0
// First, you must call the destructors, so that objects will be destroyed 
for (int i = 0; i < size; ++i) { 
    data_[i].~T(); 
} 

// Then, deallocate memory from the heap. 
delete[] data; 
संबंधित मुद्दे