यह लगभग सामान्य ज्ञान है कि नीचे दिया गया कोड 100 पूर्णांकों की मेमोरी को सही ढंग से मुक्त करता है।

int* ip = new int[100];
delete [] ip; 

और मुझे लगता है कि उपयोगकर्ता परिभाषित वर्गों के लिए भी यह काम करता है:

Node* ip = new Node[100];
delete [] ip; 
  1. पहले मामले में, क्या स्मृति का आकार मुक्त किया जाना है (400 बाइट्स), संकलन समय पर निर्धारित किया जाता है? मूल रूप से, आंतरिक रूप से क्या चल रहा है?

  2. दूसरे मामले में, क्या 100 वस्तुओं में से प्रत्येक पर Node के विनाशक को बुलाया जाएगा?

अनिवार्य रूप से, मैं इस वाक्यविन्यास का उपयोग कर रहा हूं, लेकिन यह कभी नहीं समझ पाया कि आंतरिक रूप से क्या चल रहा है और अब मैं उत्सुक हूं।

5
tanon 11 मई 2011, 10:08
1
हालांकि, सामान्य उपयोग में std::vector<> का प्रयोग करें।
 – 
GManNickG
11 मई 2011, 10:25

1 उत्तर

सबसे बढ़िया उत्तर
  1. नहीं, स्मृति आवंटक अदृश्य रूप से आकार का ट्रैक रखता है। संकलन समय पर आकार निर्धारित नहीं किया जा सकता है, क्योंकि तब आवंटन वास्तव में गतिशील नहीं होगा और निम्नलिखित काम नहीं करेगा:
size_t n;
std::cin >> n;
a = new int[n];
// do something interesting
delete[] a;
  1. हां। इस तथ्य के प्रति स्वयं को आश्वस्त करने के लिए प्रयास करें
struct Foo {
    ~Foo() { std::cout << "Goodbye, cruel world.\n"; }
};

// in main
size_t n;
std::cin >> n;
Foo *a = new Foo[n];
delete[] a;
7
Unihedron 11 अगस्त 2014, 14:13
तो क्या स्मृति आवंटक किसी संकलित सी ++ प्रोग्राम में एक अलग प्रक्रिया/धागा/मॉड्यूल है? और केस बी में डिस्ट्रक्टर को बुलाने का काम कौन करता है? क्या यह "स्मृति आवंटक" है या संकलित कोड में विनाशक को कॉल करने के निर्देश हैं? धन्यवाद!
 – 
tanon
11 मई 2011, 10:13
मेमोरी एलोकेटर सी ++ मानक पुस्तकालय का हिस्सा है। new और delete[] स्टेटमेंट्स को आमतौर पर कॉल टू फंक्शन्स में संकलित किया जाता है जो malloc और free या OS-लेवल इंटरफेस को रैप करते हैं। विनाशक को स्मृति आवंटक द्वारा भी बुलाया जाता है (यह सिर्फ एक कार्य है, आखिरकार)।
 – 
Fred Foo
11 मई 2011, 10:15
ओह ठीक है। अब समझ में आता है। यह आश्चर्य की बात है कि मैं लंबे समय से सिंटैक्स का उपयोग कैसे कर रहा हूं, यह मानते हुए कि यह जादुई रूप से काम करता है, बिना इस पर विचार किए।
 – 
tanon
11 मई 2011, 10:18
इसलिए यदि मैं लाइब्रेरी डी-आवंटक फ़ंक्शन के अंदर 'एन' क्लास ऑब्जेक्ट्स की एक सरणी को गतिशील रूप से आवंटित करता हूं, तो विनाशक को प्रत्येक ऑब्जेक्ट पर बुलाया जाएगा ... ठीक लगता है :)
 – 
tanon
11 मई 2011, 10:20
2
मैं कहूंगा कि भाषा समर्थन पुस्तकालय के हिस्से के रूप में स्मृति आवंटक की बजाय विनाशकों को कंपाइलर-इंजेक्टेड कोड द्वारा बुलाए जाने की अधिक संभावना है।
 – 
Alexey Kukanov
11 मई 2011, 10:37