ماڈیول اسباق (1/2)
std::unique_ptr اور std::shared_ptr
کلاسیکی C++ میں، new اور delete آپریٹرز کا استعمال کرتے ہوئے دستی میموری کا انتظام کیڑے کا ایک عام ذریعہ ہے جیسے کہ میموری لیک (وسائل کبھی جاری نہیں ہوتے) یا ڈینگلنگ پوائنٹرز (پوائنٹرز ڈیل لوکیٹڈ میموری کی طرف اشارہ کرتے ہیں)۔
جدید C++ متعارف کراتا ہے سمارٹ پوائنٹرز، جس کی وضاحت <memory> ہیڈر میں کی گئی ہے۔ وہ RAII (Resource Acquisition Is Initialization) کا استعمال کرتے ہوئے ڈھیر سے مختص میموری کے لائف سائیکل کو خود بخود منظم کرتے ہیں، جب سمارٹ پوائنٹر دائرہ کار سے باہر ہو جاتا ہے تو وسائل کو ڈیلویکٹ کرتے ہیں۔
std::unique_ptr
std::unique_ptr کسی وسائل کی خصوصی ملکیت کے تصور کو نافذ کرتا ہے۔ اسے کاپی نہیں کیا جا سکتا، صرف منتقل کیا جا سکتا ہے (بذریعہ std::move)۔
#include <memory>
// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);
// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;
// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2std::shared_ptr
std::shared_ptr مشترکہ ملکیت کے تصور کو نافذ کرتا ہے۔ متعدد سمارٹ پوائنٹرز ایک ہی وسائل کی طرف اشارہ کر سکتے ہیں۔ کلاس اندرونی طور پر حوالہ شمار کو برقرار رکھتی ہے: میموری صرف اس وقت آزاد ہوتی ہے جب آخری فعال shared_ptr کو تباہ یا دوبارہ ترتیب دیا جاتا ہے۔
#include <memory>
std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count
std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)خود ہی آزمائیں۔
ایک std::unique_ptr<int> نامی ptr کا اعلان کریں، اسے شروع کرتے ہوئے std::make_unique ویلیو 42 کے ساتھ شروع کریں۔ std::cout کا استعمال کرتے ہوئے ptr کی ڈیریفرنسڈ ویلیو پرنٹ کریں۔
اشارہ دکھائیں۔
`std::unique_ptr<int> ptr = std::make_unique<int>(42);` استعمال کریں اور پھر آؤٹ پٹ اسٹریم میں `*ptr` بھیجیں۔
3 کوششوں کے بعد حل دستیاب ہے۔
std::make_shared کا استعمال کرتے ہوئے 100 ویلیو کے ساتھ ptr1 نامی ایک std::shared_ptr<int> انسٹینٹیٹ کریں۔ ptr2 کے نام سے ایک کاپی بنائیں، اور std::cout کا استعمال کرتے ہوئے ptr1.use_count() کے ذریعے واپس آنے والی ویلیو کو پرنٹ کریں۔
اشارہ دکھائیں۔
کاپی معیاری اسائنمنٹ کے ذریعے کی جاتی ہے: `ptr2 = ptr1;`۔ پرنٹ `ptr1.use_count()` کو 2 دکھانا چاہئے۔
3 کوششوں کے بعد حل دستیاب ہے۔