यह लगभग सामान्य ज्ञान है कि नीचे दिया गया कोड 100 पूर्णांकों की मेमोरी को सही ढंग से मुक्त करता है।
int* ip = new int[100];
delete [] ip;
और मुझे लगता है कि उपयोगकर्ता परिभाषित वर्गों के लिए भी यह काम करता है:
Node* ip = new Node[100];
delete [] ip;
पहले मामले में, क्या स्मृति का आकार मुक्त किया जाना है (400 बाइट्स), संकलन समय पर निर्धारित किया जाता है? मूल रूप से, आंतरिक रूप से क्या चल रहा है?
दूसरे मामले में, क्या 100 वस्तुओं में से प्रत्येक पर
Node
के विनाशक को बुलाया जाएगा?
अनिवार्य रूप से, मैं इस वाक्यविन्यास का उपयोग कर रहा हूं, लेकिन यह कभी नहीं समझ पाया कि आंतरिक रूप से क्या चल रहा है और अब मैं उत्सुक हूं।
1 उत्तर
- नहीं, स्मृति आवंटक अदृश्य रूप से आकार का ट्रैक रखता है। संकलन समय पर आकार निर्धारित नहीं किया जा सकता है, क्योंकि तब आवंटन वास्तव में गतिशील नहीं होगा और निम्नलिखित काम नहीं करेगा:
size_t n;
std::cin >> n;
a = new int[n];
// do something interesting
delete[] a;
- हां। इस तथ्य के प्रति स्वयं को आश्वस्त करने के लिए प्रयास करें
struct Foo {
~Foo() { std::cout << "Goodbye, cruel world.\n"; }
};
// in main
size_t n;
std::cin >> n;
Foo *a = new Foo[n];
delete[] a;
new
और delete[]
स्टेटमेंट्स को आमतौर पर कॉल टू फंक्शन्स में संकलित किया जाता है जो malloc
और free
या OS-लेवल इंटरफेस को रैप करते हैं। विनाशक को स्मृति आवंटक द्वारा भी बुलाया जाता है (यह सिर्फ एक कार्य है, आखिरकार)।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।
std::vector<>
का प्रयोग करें।