שיעורי מודול (1/2)
std::unique_ptr ו-std::shared_ptr
ב-C++ הקלאסי, ניהול זיכרון ידני באמצעות האופרטורים new וdelete הוא מקור נפוץ לבאגים כגון דליפות זיכרון (משאבים מעולם לא שוחררו) או מצביעים משתלשלים (מצביעים המצביעים על זיכרון שהוקצה).
C++ המודרני מציג את Smart Pointers, המוגדרים בכותרת <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. הדפס את הערך המיוחל של ptr באמצעות std::cout.
הצג רמז
השתמש ב-`std::unique_ptr<int> ptr = std::make_unique<int>(42);` ולאחר מכן שלח `*ptr` לזרם הפלט.
הפתרון זמין לאחר 3 ניסיונות
הצג std::shared_ptr<int> בשם ptr1 עם הערך 100 באמצעות std::make_shared. צור עותק בשם ptr2, והדפיס את הערך המוחזר על ידי ptr1.use_count() באמצעות std::cout.
הצג רמז
ההעתקה מתבצעת באמצעות מטלה סטנדרטית: `ptr2 = ptr1;`. הדפסת `ptr1.use_count()` אמורה להציג 2.
הפתרון זמין לאחר 3 ניסיונות