"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > C++ में प्लेसमेंट न्यू के साथ आवंटित मेमोरी को उचित तरीके से कैसे हटाएं?

C++ में प्लेसमेंट न्यू के साथ आवंटित मेमोरी को उचित तरीके से कैसे हटाएं?

2024-11-07 को प्रकाशित
ब्राउज़ करें:691

How to Properly Deallocate Memory Allocated with Placement New in C  ?

प्लेसमेंट नया और हटाएं पहेली

सी में, प्लेसमेंट नए ऑपरेटर के साथ मेमोरी आवंटित करते समय, डीलोकेटिंग के लिए उचित विधि के बारे में एक दुविधा उत्पन्न होती है वह स्मृति. आइए दो संभावित समाधान तलाशें:

समाधान 1:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete (char*)buf;

यह समाधान वर्ण सूचक के रूप में आवंटित मेमोरी को हटाने का प्रयास करता है। हालाँकि, यह दृष्टिकोण गलत है क्योंकि यह ऑब्जेक्ट के डिस्ट्रक्टर को ठीक से संभाल नहीं पाता है या कच्ची मेमोरी को हटा नहीं पाता है।

समाधान 2:

const char* charString = "Hello, World";
void *mem = ::operator new(sizeof(Buffer)   strlen(charString)   1);
Buffer* buf = new(mem) Buffer(strlen(charString));
delete buf;

यह समाधान आवंटित मेमोरी को हटाने का भी प्रयास करता है, लेकिन सीधे बफ़र* पॉइंटर पर डिलीट ऑपरेटर को कॉल करता है। यह तब काम करेगा जब मेमोरी को नियमित नए ऑपरेटर का उपयोग करके आवंटित किया गया हो। हालाँकि, चूंकि प्लेसमेंट न्यू का उपयोग किया गया था, इसलिए यह दृष्टिकोण भी गलत है। &&&]

buf->~बफर(); ::operator delete(mem);

यह समाधान स्पष्ट रूप से बफ़र ऑब्जेक्ट (buf->~Buffer()) के लिए डिस्ट्रक्टर को कॉल करता है और फिर ऑपरेटर डिलीट फ़ंक्शन (::ऑपरेटर डिलीट() का उपयोग करके कच्ची मेमोरी को हटा देता है mem)).

यहां महत्वपूर्ण अंतर यह है कि प्लेसमेंट न्यू का उपयोग करते समय, रॉ मेमोरी को मुक्त करने के लिए ऑपरेटर डिलीट फ़ंक्शन को सीधे कॉल किया जाना चाहिए। प्लेसमेंट नए ऑपरेटर से प्राप्त पॉइंटर को हटाने का प्रयास करने से डिस्ट्रक्टर को ठीक से लागू नहीं किया जाएगा या मेमोरी को पूरी तरह से हटा नहीं दिया जाएगा।

नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3