गतिशील आवंटन केवल तभी आवश्यक होता है जब वस्तु का जीवन-काल उस दायरे से अलग होना चाहिए जो इसमें निर्मित होता है (यह गुंजाइश को बड़ा बनाने के लिए भी है) और आपके पास एक विशिष्ट कारण है जहां इसे मूल्य द्वारा संग्रहीत नहीं किया जाता है काम।
उदाहरण के लिए:
std::vector<int> *createVector(); // Bad
std::vector<int> createVector(); // Good
auto v = new std::vector<int>(); // Bad
auto result = calculate(/*optional output = */ v);
auto v = std::vector<int>(); // Good
auto result = calculate(/*optional output = */ &v);
C ++ 11 से, हमारे पास std::unique_ptr
आवंटित मेमोरी से निपटने के लिए है, जिसमें आवंटित मेमोरी का स्वामित्व है।std::shared_ptr
आपको स्वामित्व साझा करने के लिए कब बनाया गया था। (आपको एक अच्छे कार्यक्रम में इसकी अपेक्षा से कम की आवश्यकता होगी)
एक उदाहरण बनाना वास्तव में आसान हो जाता है:
auto instance = std::make_unique<Class>(/*args*/); // C++14
auto instance = std::make_unique<Class>(new Class(/*args*/)); // C++11
auto instance = std::make_unique<Class[]>(42); // C++14
auto instance = std::make_unique<Class[]>(new Class[](42)); // C++11
C ++ 17 भी जोड़ता है std::optional
जो आपको मेमोरी आवंटन की आवश्यकता को रोक सकता है
auto optInstance = std::optional<Class>{};
if (condition)
optInstance = Class{};
जैसे ही gets मिसाल ’दायरे से बाहर होती है, स्मृति साफ़ हो जाती है। स्वामित्व स्थानांतरित करना भी आसान है:
auto vector = std::vector<std::unique_ptr<Interface>>{};
auto instance = std::make_unique<Class>();
vector.push_back(std::move(instance)); // std::move -> transfer (most of the time)
तो आपको अभी भी कब आवश्यकता है new
? C ++ 11 से लगभग कभी नहीं। आप में से अधिकांश std::make_unique
तब तक उपयोग करते हैं जब तक कि आप एक ऐसे बिंदु पर नहीं पहुंच जाते हैं जहां आप एक एपीआई को मारते हैं जो कच्चे पॉइंटर्स के माध्यम से स्वामित्व स्थानांतरित करता है।
auto instance = std::make_unique<Class>();
legacyFunction(instance.release()); // Ownership being transferred
auto instance = std::unique_ptr<Class>{legacyFunction()}; // Ownership being captured in unique_ptr
C ++ 98/03 में, आपको मैन्युअल मेमोरी मैनेजमेंट करना होगा। यदि आप इस मामले में हैं, तो मानक के अधिक हाल के संस्करण में अपग्रेड करने का प्रयास करें। यदि आप फंस गए हैं:
auto instance = new Class(); // Allocate memory
delete instance; // Deallocate
auto instances = new Class[42](); // Allocate memory
delete[] instances; // Deallocate
सुनिश्चित करें कि आप स्वामित्व को सही ढंग से ट्रैक करते हैं ताकि कोई मेमोरी लीक न हो! चाल शब्दार्थ अभी भी काम नहीं करते हैं।
तो, हमें C ++ में मॉलॉक की आवश्यकता कब है? एकमात्र मान्य कारण मेमोरी को आवंटित करना और इसे बाद में प्लेसमेंट नए के माध्यम से प्रारंभ करना होगा।
auto instanceBlob = std::malloc(sizeof(Class)); // Allocate memory
auto instance = new(instanceBlob)Class{}; // Initialize via constructor
instance.~Class(); // Destroy via destructor
std::free(instanceBlob); // Deallocate the memory
हालांकि, उपरोक्त मान्य है, यह एक नए-ऑपरेटर के माध्यम से भी किया जा सकता है। std::vector
इसके लिए एक अच्छा उदाहरण है।
अंत में, हमारे पास अभी भी कमरे में हाथी है C
:। यदि आपको सी-लाइब्रेरी के साथ काम करना है, जहां मेमोरी सी ++ कोड में आवंटित की जाती है और सी कोड (या अन्य तरीके से) में मुक्त किया जाता है, तो आपको मॉलोक / मुफ्त का उपयोग करने के लिए मजबूर किया जाता है।
यदि आप इस मामले में हैं, तो वर्चुअल फ़ंक्शंस, सदस्य फ़ंक्शंस, क्लासेस के बारे में भूल जाएं ... इसमें केवल POD वाले स्ट्रक्चर्स की अनुमति है।
नियमों के कुछ अपवाद:
- आप उन्नत डेटा संरचनाओं के साथ एक मानक पुस्तकालय लिख रहे हैं जहां मॉलॉक उपयुक्त है
- आपको बड़ी मात्रा में मेमोरी (10GB फ़ाइल की मेमोरी कॉपी में) आवंटित करनी होगी?
- आपके पास कुछ निर्माणों का उपयोग करने के लिए टूलींग है
- आपको एक अपूर्ण प्रकार संग्रहीत करने की आवश्यकता है