मजबूत मेमरी व्यवस्थापनासाठी आधुनिक C++ स्मार्ट पॉइंटर्स (unique_ptr, shared_ptr, weak_ptr) एक्सप्लोर करा, मेमरी लीक्सना प्रतिबंध करा आणि ॲप्लिकेशनची स्थिरता वाढवा. सर्वोत्तम पद्धती आणि व्यावहारिक उदाहरणे शिका.
C++ आधुनिक वैशिष्ट्ये: कार्यक्षम मेमरी व्यवस्थापनासाठी स्मार्ट पॉइंटर्समध्ये प्रभुत्व मिळवणे
आधुनिक C++ मध्ये, मेमरी सुरक्षितपणे आणि कार्यक्षमतेने व्यवस्थापित करण्यासाठी स्मार्ट पॉइंटर्स हे अपरिहार्य साधने आहेत. ते मेमरी डीअॅलोकेशनची प्रक्रिया स्वयंचलित करतात, ज्यामुळे मेमरी लीक्स आणि डँगलिंग पॉइंटर्स टाळले जातात, जे पारंपारिक C++ प्रोग्रामिंगमधील सामान्य त्रुटी आहेत. हे सर्वसमावेशक मार्गदर्शक C++ मध्ये उपलब्ध असलेल्या विविध प्रकारच्या स्मार्ट पॉइंटर्सचा शोध घेते आणि त्यांचा प्रभावीपणे वापर कसा करायचा याची व्यावहारिक उदाहरणे प्रदान करते.
स्मार्ट पॉइंटर्सची गरज समजून घेणे
स्मार्ट पॉइंटर्सच्या तपशिलात जाण्यापूर्वी, ते कोणत्या आव्हानांवर मात करतात हे समजून घेणे महत्त्वाचे आहे. क्लासिक C++ मध्ये, डेव्हलपर्स new
आणि delete
वापरून मॅन्युअली मेमरी ॲलोकेट आणि डीअॅलोकेट करण्यासाठी जबाबदार असतात. हे मॅन्युअल व्यवस्थापन त्रुटी-प्रवण आहे, ज्यामुळे खालील गोष्टी होऊ शकतात:
- मेमरी लीक्स: मेमरीची गरज नसताना ती डीअॅलोकेट करण्यात अयशस्वी होणे.
- डँगलिंग पॉइंटर्स: आधीच डीअॅलोकेट केलेल्या मेमरीकडे पॉइंट करणारे पॉइंटर्स.
- डबल फ्री: एकाच मेमरी ब्लॉकला दोनदा डीअॅलोकेट करण्याचा प्रयत्न करणे.
या समस्यांमुळे प्रोग्राम क्रॅश होऊ शकतो, अनपेक्षित वर्तन होऊ शकते आणि सुरक्षिततेच्या त्रुटी निर्माण होऊ शकतात. स्मार्ट पॉइंटर्स डायनॅमिकली ॲलोकेट केलेल्या ऑब्जेक्ट्सचे आयुष्य स्वयंचलितपणे व्यवस्थापित करून एक सुंदर उपाय प्रदान करतात, जे रिसोर्स ॲक्विझिशन इज इनिशियलायझेशन (RAII) तत्त्वाचे पालन करतात.
RAII आणि स्मार्ट पॉइंटर्स: एक शक्तिशाली संयोजन
स्मार्ट पॉइंटर्समागील मूळ संकल्पना RAII आहे, जी सांगते की रिसोर्सेस ऑब्जेक्ट कन्स्ट्रक्शन दरम्यान मिळवले पाहिजेत आणि ऑब्जेक्ट डिस्ट्रक्शन दरम्यान रिलीज केले पाहिजेत. स्मार्ट पॉइंटर्स हे क्लासेस आहेत जे रॉ पॉइंटरला एन्कॅप्स्युलेट करतात आणि स्मार्ट पॉइंटर स्कोपच्या बाहेर गेल्यावर पॉइंट केलेल्या ऑब्जेक्टला स्वयंचलितपणे डिलीट करतात. यामुळे हे सुनिश्चित होते की अपवादांच्या (exceptions) उपस्थितीतही मेमरी नेहमी डीअॅलोकेट केली जाते.
C++ मधील स्मार्ट पॉइंटर्सचे प्रकार
C++ तीन प्राथमिक प्रकारचे स्मार्ट पॉइंटर्स प्रदान करते, प्रत्येकाची स्वतःची वैशिष्ट्ये आणि उपयोग आहेत:
std::unique_ptr
std::shared_ptr
std::weak_ptr
std::unique_ptr
: विशेष मालकी (Exclusive Ownership)
std::unique_ptr
डायनॅमिकली ॲलोकेट केलेल्या ऑब्जेक्टवर विशेष मालकी दर्शवतो. कोणत्याही वेळी फक्त एक unique_ptr
दिलेल्या ऑब्जेक्टकडे पॉइंट करू शकतो. जेव्हा unique_ptr
स्कोपच्या बाहेर जातो, तेव्हा तो व्यवस्थापित करत असलेला ऑब्जेक्ट स्वयंचलितपणे डिलीट होतो. यामुळे unique_ptr
अशा परिस्थितींसाठी आदर्श ठरतो जिथे एकाच घटकाने ऑब्जेक्टच्या लाइफटाइमची जबाबदारी घेतली पाहिजे.
उदाहरण: std::unique_ptr
वापरणे
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass(int value) : value_(value) {
std::cout << "MyClass constructed with value: " << value_ << std::endl;
}
~MyClass() {
std::cout << "MyClass destructed with value: " << value_ << std::endl;
}
int getValue() const { return value_; }
private:
int value_;
};
int main() {
std::unique_ptr<MyClass> ptr(new MyClass(10)); // एक unique_ptr तयार करा
if (ptr) { // पॉइंटर वैध आहे की नाही ते तपासा
std::cout << "Value: " << ptr->getValue() << std::endl;
}
// जेव्हा ptr स्कोपच्या बाहेर जातो, तेव्हा MyClass ऑब्जेक्ट स्वयंचलितपणे डिलीट होतो
return 0;
}
std::unique_ptr
ची प्रमुख वैशिष्ट्ये:
- कॉपी नाही (No Copying):
unique_ptr
कॉपी केला जाऊ शकत नाही, ज्यामुळे एकाच ऑब्जेक्टवर अनेक पॉइंटर्सची मालकी असण्यास प्रतिबंध होतो. हे विशेष मालकीची अंमलबजावणी करते. - मूव्ह सिमेंटिक्स (Move Semantics):
std::move
वापरूनunique_ptr
हलवला जाऊ शकतो, ज्यामुळे मालकी एकाunique_ptr
कडून दुसऱ्याकडे हस्तांतरित होते. - कस्टम डिलीटर्स (Custom Deleters): जेव्हा
unique_ptr
स्कोपच्या बाहेर जातो तेव्हा कॉल करण्यासाठी तुम्ही कस्टम डिलीटर फंक्शन निर्दिष्ट करू शकता, ज्यामुळे तुम्हाला डायनॅमिकली ॲलोकेट केलेल्या मेमरीव्यतिरिक्त इतर रिसोर्सेस (उदा. फाइल हँडल्स, नेटवर्क सॉकेट्स) व्यवस्थापित करता येतात.
उदाहरण: std::unique_ptr
सह std::move
वापरणे
#include <iostream>
#include <memory>
int main() {
std::unique_ptr<int> ptr1(new int(42));
std::unique_ptr<int> ptr2 = std::move(ptr1); // मालकी ptr2 कडे हस्तांतरित करा
if (ptr1) {
std::cout << "ptr1 is still valid" << std::endl; // हे कार्यान्वित होणार नाही
} else {
std::cout << "ptr1 is now null" << std::endl; // हे कार्यान्वित होईल
}
if (ptr2) {
std::cout << "Value pointed to by ptr2: " << *ptr2 << std::endl; // आउटपुट: Value pointed to by ptr2: 42
}
return 0;
}
उदाहरण: std::unique_ptr
सह कस्टम डिलीटर्स वापरणे
#include <iostream>
#include <memory>
// फाइल हँडल्ससाठी कस्टम डिलीटर
struct FileDeleter {
void operator()(FILE* file) const {
if (file) {
fclose(file);
std::cout << "File closed." << std::endl;
}
}
};
int main() {
// एक फाइल उघडा
FILE* file = fopen("example.txt", "w");
if (!file) {
std::cerr << "Error opening file." << std::endl;
return 1;
}
// कस्टम डिलीटरसह एक unique_ptr तयार करा
std::unique_ptr<FILE, FileDeleter> filePtr(file);
// फाइलमध्ये लिहा (पर्यायी)
fprintf(filePtr.get(), "Hello, world!\n");
// जेव्हा filePtr स्कोपच्या बाहेर जाईल, तेव्हा फाइल स्वयंचलितपणे बंद होईल
return 0;
}
std::shared_ptr
: सामायिक मालकी (Shared Ownership)
std::shared_ptr
डायनॅमिकली ॲलोकेट केलेल्या ऑब्जेक्टची सामायिक मालकी सक्षम करतो. अनेक shared_ptr
इंस्टन्सेस एकाच ऑब्जेक्टकडे पॉइंट करू शकतात, आणि ऑब्जेक्ट तेव्हाच डिलीट होतो जेव्हा त्याच्याकडे पॉइंट करणारा शेवटचा shared_ptr
स्कोपच्या बाहेर जातो. हे रेफरन्स काउंटिंगद्वारे साध्य केले जाते, जिथे प्रत्येक shared_ptr
तयार किंवा कॉपी केल्यावर काउंट वाढवतो आणि नष्ट झाल्यावर काउंट कमी करतो.
उदाहरण: std::shared_ptr
वापरणे
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> ptr1(new int(100));
std::cout << "Reference count: " << ptr1.use_count() << std::endl; // आउटपुट: Reference count: 1
std::shared_ptr<int> ptr2 = ptr1; // shared_ptr कॉपी करा
std::cout << "Reference count: " << ptr1.use_count() << std::endl; // आउटपुट: Reference count: 2
std::cout << "Reference count: " << ptr2.use_count() << std::endl; // आउटपुट: Reference count: 2
{
std::shared_ptr<int> ptr3 = ptr1; // स्कोपमध्ये shared_ptr कॉपी करा
std::cout << "Reference count: " << ptr1.use_count() << std::endl; // आउटपुट: Reference count: 3
} // ptr3 स्कोपच्या बाहेर जातो, रेफरन्स काउंट कमी होतो
std::cout << "Reference count: " << ptr1.use_count() << std::endl; // आउटपुट: Reference count: 2
ptr1.reset(); // मालकी सोडा
std::cout << "Reference count: " << ptr2.use_count() << std::endl; // आउटपुट: Reference count: 1
ptr2.reset(); // मालकी सोडा, ऑब्जेक्ट आता डिलीट झाला आहे
return 0;
}
std::shared_ptr
ची प्रमुख वैशिष्ट्ये:
- सामायिक मालकी: अनेक
shared_ptr
इंस्टन्सेस एकाच ऑब्जेक्टकडे पॉइंट करू शकतात. - रेफरन्स काउंटिंग: ऑब्जेक्टकडे पॉइंट करणाऱ्या
shared_ptr
इंस्टन्सेसची संख्या ट्रॅक करून ऑब्जेक्टच्या लाइफटाइमचे व्यवस्थापन करते. - स्वयंचलित डिलीशन: जेव्हा शेवटचा
shared_ptr
स्कोपच्या बाहेर जातो तेव्हा ऑब्जेक्ट स्वयंचलितपणे डिलीट होतो. - थ्रेड सेफ्टी: रेफरन्स काउंट अपडेट्स थ्रेड-सेफ असतात, ज्यामुळे
shared_ptr
मल्टीथ्रेडेड वातावरणात वापरता येतो. तथापि, पॉइंट केलेल्या ऑब्जेक्टमध्ये प्रवेश करणे थ्रेड-सेफ नसते आणि त्यासाठी बाह्य सिंक्रोनाइझेशनची आवश्यकता असते. - कस्टम डिलीटर्स:
unique_ptr
प्रमाणेच कस्टम डिलीटर्सना सपोर्ट करतो.
std::shared_ptr
साठी महत्त्वाचे विचार:
- सर्क्युलर डिपेंडेंसी: सर्क्युलर डिपेंडेंसीबद्दल सावध रहा, जिथे दोन किंवा अधिक ऑब्जेक्ट्स
shared_ptr
वापरून एकमेकांकडे पॉइंट करतात. यामुळे मेमरी लीक होऊ शकते कारण रेफरन्स काउंट कधीही शून्यावर पोहोचणार नाही.std::weak_ptr
हे चक्र तोडण्यासाठी वापरले जाऊ शकते. - परफॉर्मन्स ओव्हरहेड: रेफरन्स काउंटिंगमुळे रॉ पॉइंटर्स किंवा
unique_ptr
च्या तुलनेत काही परफॉर्मन्स ओव्हरहेड येतो.
std::weak_ptr
: मालकी नसलेला निरीक्षक (Non-Owning Observer)
std::weak_ptr
हा shared_ptr
द्वारे व्यवस्थापित केलेल्या ऑब्जेक्टचा मालकी नसलेला रेफरन्स प्रदान करतो. तो रेफरन्स काउंटिंग यंत्रणेत भाग घेत नाही, याचा अर्थ असा की जेव्हा सर्व shared_ptr
इंस्टन्सेस स्कोपच्या बाहेर जातात तेव्हा तो ऑब्जेक्टला डिलीट होण्यापासून प्रतिबंधित करत नाही. weak_ptr
मालकी न घेता ऑब्जेक्टचे निरीक्षण करण्यासाठी उपयुक्त आहे, विशेषतः सर्क्युलर डिपेंडेंसी तोडण्यासाठी.
उदाहरण: सर्क्युलर डिपेंडेंसी तोडण्यासाठी std::weak_ptr
वापरणे
#include <iostream>
#include <memory>
class B;
class A {
public:
std::shared_ptr<B> b;
~A() { std::cout << "A destroyed" << std::endl; }
};
class B {
public:
std::weak_ptr<A> a; // सर्क्युलर डिपेंडेंसी टाळण्यासाठी weak_ptr वापरणे
~B() { std::cout << "B destroyed" << std::endl; }
};
int main() {
std::shared_ptr<A> a = std::make_shared<A>();
std::shared_ptr<B> b = std::make_shared<B>();
a->b = b;
b->a = a;
// weak_ptr शिवाय, सर्क्युलर डिपेंडेंसीमुळे A आणि B कधीही नष्ट झाले नसते
return 0;
} // A आणि B योग्यरित्या नष्ट झाले
उदाहरण: ऑब्जेक्टची वैधता तपासण्यासाठी std::weak_ptr
वापरणे
#include <iostream>
#include <memory>
int main() {
std::shared_ptr<int> sharedPtr = std::make_shared<int>(123);
std::weak_ptr<int> weakPtr = sharedPtr;
// ऑब्जेक्ट अजूनही अस्तित्वात आहे का ते तपासा
if (auto observedPtr = weakPtr.lock()) { // lock() ऑब्जेक्ट अस्तित्वात असल्यास shared_ptr परत करतो
std::cout << "Object exists: " << *observedPtr << std::endl; // आउटपुट: Object exists: 123
}
sharedPtr.reset(); // मालकी सोडा
// sharedPtr रीसेट झाल्यानंतर पुन्हा तपासा
if (auto observedPtr = weakPtr.lock()) {
std::cout << "Object exists: " << *observedPtr << std::endl; // हे कार्यान्वित होणार नाही
} else {
std::cout << "Object has been destroyed." << std::endl; // आउटपुट: Object has been destroyed.
}
return 0;
}
std::weak_ptr
ची प्रमुख वैशिष्ट्ये:
- मालकी नसलेला: रेफरन्स काउंटिंगमध्ये भाग घेत नाही.
- निरीक्षक: मालकी न घेता ऑब्जेक्टचे निरीक्षण करण्याची परवानगी देतो.
- सर्क्युलर डिपेंडेंसी तोडणे:
shared_ptr
द्वारे व्यवस्थापित केलेल्या ऑब्जेक्ट्समधील सर्क्युलर डिपेंडेंसी तोडण्यासाठी उपयुक्त. - ऑब्जेक्टची वैधता तपासणे: ऑब्जेक्ट अजूनही अस्तित्वात आहे की नाही हे तपासण्यासाठी वापरले जाऊ शकते,
lock()
पद्धत वापरून, जी ऑब्जेक्ट जिवंत असल्यासshared_ptr
परत करते किंवा नष्ट झाला असल्यास नलshared_ptr
परत करते.
योग्य स्मार्ट पॉइंटर निवडणे
योग्य स्मार्ट पॉइंटर निवडणे हे तुम्हाला कोणत्या मालकी सिमेंटिक्सची अंमलबजावणी करायची आहे यावर अवलंबून असते:
unique_ptr
: जेव्हा तुम्हाला ऑब्जेक्टवर विशेष मालकी हवी असेल तेव्हा वापरा. हा सर्वात कार्यक्षम स्मार्ट पॉइंटर आहे आणि शक्य असेल तेव्हा त्याला प्राधान्य दिले पाहिजे.shared_ptr
: जेव्हा अनेक घटकांना ऑब्जेक्टची मालकी सामायिक करण्याची आवश्यकता असेल तेव्हा वापरा. संभाव्य सर्क्युलर डिपेंडेंसी आणि परफॉर्मन्स ओव्हरहेडबद्दल जागरूक रहा.weak_ptr
: जेव्हा तुम्हालाshared_ptr
द्वारे व्यवस्थापित केलेल्या ऑब्जेक्टचे निरीक्षण करण्याची आवश्यकता असेल, मालकी न घेता, विशेषतः सर्क्युलर डिपेंडेंसी तोडण्यासाठी किंवा ऑब्जेक्टची वैधता तपासण्यासाठी वापरा.
स्मार्ट पॉइंटर्स वापरण्यासाठी सर्वोत्तम पद्धती
स्मार्ट पॉइंटर्सचे फायदे जास्तीत जास्त मिळवण्यासाठी आणि सामान्य चुका टाळण्यासाठी, या सर्वोत्तम पद्धतींचे अनुसरण करा:
std::make_unique
आणिstd::make_shared
ला प्राधान्य द्या: ही फंक्शन्स एक्सेप्शन सेफ्टी प्रदान करतात आणि कंट्रोल ब्लॉक व ऑब्जेक्ट एकाच मेमरी ॲलोकेशनमध्ये ॲलोकेट करून परफॉर्मन्स सुधारू शकतात.- रॉ पॉइंटर्स टाळा: तुमच्या कोडमध्ये रॉ पॉइंटर्सचा वापर कमी करा. शक्य असेल तेव्हा डायनॅमिकली ॲलोकेट केलेल्या ऑब्जेक्ट्सच्या लाइफटाइमचे व्यवस्थापन करण्यासाठी स्मार्ट पॉइंटर्स वापरा.
- स्मार्ट पॉइंटर्स त्वरित इनिशियलाइज करा: अनइनिशियलाइज्ड पॉइंटर समस्या टाळण्यासाठी स्मार्ट पॉइंटर्स घोषित केल्यावर लगेच इनिशियलाइज करा.
- सर्क्युलर डिपेंडेंसीबद्दल जागरूक रहा:
shared_ptr
द्वारे व्यवस्थापित केलेल्या ऑब्जेक्ट्समधील सर्क्युलर डिपेंडेंसी तोडण्यासाठीweak_ptr
वापरा. - मालकी घेणाऱ्या फंक्शन्सना रॉ पॉइंटर्स पास करणे टाळा: अपघाती मालकी हस्तांतरण किंवा डबल डिलीशन समस्या टाळण्यासाठी स्मार्ट पॉइंटर्स व्हॅल्यूद्वारे किंवा रेफरन्सद्वारे पास करा.
उदाहरण: std::make_unique
आणि std::make_shared
वापरणे
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass(int value) : value_(value) {
std::cout << "MyClass constructed with value: " << value_ << std::endl;
}
~MyClass() {
std::cout << "MyClass destructed with value: " << value_ << std::endl;
}
int getValue() const { return value_; }
private:
int value_;
};
int main() {
// std::make_unique वापरा
std::unique_ptr<MyClass> uniquePtr = std::make_unique<MyClass>(50);
std::cout << "Unique pointer value: " << uniquePtr->getValue() << std::endl;
// std::make_shared वापरा
std::shared_ptr<MyClass> sharedPtr = std::make_shared<MyClass>(100);
std::cout << "Shared pointer value: " << sharedPtr->getValue() << std::endl;
return 0;
}
स्मार्ट पॉइंटर्स आणि एक्सेप्शन सेफ्टी
स्मार्ट पॉइंटर्स एक्सेप्शन सेफ्टीमध्ये महत्त्वपूर्ण योगदान देतात. डायनॅमिकली ॲलोकेट केलेल्या ऑब्जेक्ट्सच्या लाइफटाइमचे स्वयंचलितपणे व्यवस्थापन करून, ते सुनिश्चित करतात की एक्सेप्शन थ्रो झाला तरी मेमरी डीअॅलोकेट केली जाईल. हे मेमरी लीक्सला प्रतिबंध करते आणि तुमच्या ॲप्लिकेशनची अखंडता टिकवून ठेवण्यास मदत करते.
रॉ पॉइंटर्स वापरताना संभाव्यतः मेमरी लीक होण्याचे खालील उदाहरण विचारात घ्या:
#include <iostream>
void processData() {
int* data = new int[100]; // मेमरी ॲलोकेट करा
// काही ऑपरेशन्स करा ज्यामुळे एक्सेप्शन येऊ शकतो
try {
// ... संभाव्यतः एक्सेप्शन थ्रो करणारा कोड ...
throw std::runtime_error("Something went wrong!"); // उदाहरण एक्सेप्शन
} catch (...) {
delete[] data; // कॅच ब्लॉकमध्ये मेमरी डीअॅलोकेट करा
throw; // एक्सेप्शन पुन्हा थ्रो करा
}
delete[] data; // मेमरी डीअॅलोकेट करा (केवळ एक्सेप्शन थ्रो न झाल्यास पोहोचेल)
}
जर try
ब्लॉकच्या आत पहिल्या delete[] data;
स्टेटमेंटच्या *आधी* एक्सेप्शन थ्रो झाला, तर data
साठी ॲलोकेट केलेली मेमरी लीक होईल. स्मार्ट पॉइंटर्स वापरून, हे टाळता येते:
#include <iostream>
#include <memory>
void processData() {
std::unique_ptr<int[]> data(new int[100]); // स्मार्ट पॉइंटर वापरून मेमरी ॲलोकेट करा
// काही ऑपरेशन्स करा ज्यामुळे एक्सेप्शन येऊ शकतो
try {
// ... संभाव्यतः एक्सेप्शन थ्रो करणारा कोड ...
throw std::runtime_error("Something went wrong!"); // उदाहरण एक्सेप्शन
} catch (...) {
throw; // एक्सेप्शन पुन्हा थ्रो करा
}
// data स्पष्टपणे डिलीट करण्याची गरज नाही; unique_ptr ते स्वयंचलितपणे हाताळेल
}
या सुधारित उदाहरणात, unique_ptr
data
साठी ॲलोकेट केलेल्या मेमरीचे स्वयंचलितपणे व्यवस्थापन करते. जर एक्सेप्शन थ्रो झाला, तर स्टॅक अनवाइंड होताना unique_ptr
चा डिस्ट्रक्टर कॉल केला जाईल, ज्यामुळे एक्सेप्शन पकडला गेला किंवा पुन्हा थ्रो केला गेला याची पर्वा न करता मेमरी डीअॅलोकेट होईल हे सुनिश्चित होते.
निष्कर्ष
सुरक्षित, कार्यक्षम आणि देखरेख करण्यायोग्य C++ कोड लिहिण्यासाठी स्मार्ट पॉइंटर्स हे मूलभूत साधने आहेत. मेमरी व्यवस्थापन स्वयंचलित करून आणि RAII तत्त्वाचे पालन करून, ते रॉ पॉइंटर्सशी संबंधित सामान्य धोके दूर करतात आणि अधिक मजबूत ॲप्लिकेशन्समध्ये योगदान देतात. विविध प्रकारचे स्मार्ट पॉइंटर्स आणि त्यांचे योग्य उपयोग समजून घेणे प्रत्येक C++ डेव्हलपरसाठी आवश्यक आहे. स्मार्ट पॉइंटर्सचा अवलंब करून आणि सर्वोत्तम पद्धतींचे अनुसरण करून, तुम्ही मेमरी लीक्स, डँगलिंग पॉइंटर्स आणि इतर मेमरी-संबंधित त्रुटी लक्षणीयरीत्या कमी करू शकता, ज्यामुळे अधिक विश्वसनीय आणि सुरक्षित सॉफ्टवेअर तयार होते.
उच्च-कार्यक्षमता संगणनासाठी आधुनिक C++ चा फायदा घेणाऱ्या सिलिकॉन व्हॅलीमधील स्टार्टअप्सपासून ते मिशन-क्रिटिकल सिस्टम्स विकसित करणाऱ्या जागतिक एंटरप्राइजेसपर्यंत, स्मार्ट पॉइंटर्स सार्वत्रिकपणे लागू आहेत. तुम्ही इंटरनेट ऑफ थिंग्जसाठी एम्बेडेड सिस्टम्स तयार करत असाल किंवा अत्याधुनिक वित्तीय ॲप्लिकेशन्स विकसित करत असाल, स्मार्ट पॉइंटर्समध्ये प्रभुत्व मिळवणे हे उत्कृष्टतेसाठी प्रयत्न करणाऱ्या कोणत्याही C++ डेव्हलपरसाठी एक महत्त्वाचे कौशल्य आहे.
अधिक शिक्षण
- cppreference.com: https://en.cppreference.com/w/cpp/memory
- Effective Modern C++ by Scott Meyers
- C++ Primer by Stanley B. Lippman, Josée Lajoie, and Barbara E. Moo