C ++ shared_ptr

C Shared_ptr



ה shared_ptr הוא סוג אחד של מצביעים חכמים של C ++ המכיל את הבעלות המשותפת על האובייקט שנוצר על ידי המצביע. הוא חולק את הבעלות על האובייקט בעת אחסון המצביע באובייקט אחר, ומונה ההתייחסות המשותף סופר את מספר הבעלים. ה shared_ptr מגדיל את מונה ההתייחסות באחד לאחר העתקת האובייקט ומקטין את מונה ההתייחסות באחד לאחר השמדת האובייקט. הזיכרון שבבעלות האובייקט מוקצה מחדש אם האובייקט שבבעלות האחרון shared_ptr נהרס, או אִתחוּל() פונקציה נקראת להקצות מצביע אחר לאובייקט. כאשר shared_ptr אינו בעל אובייקט כלשהו, ​​אז הוא נקרא מצביע משותף ריק. שימושים שונים של shared_ptr הוצגו במדריך זה.

דוגמה 1: הכריז על מצביע משותף בדרכים שונות

שלוש דרכים שונות להכריז על מצביע משותף מוצגות בדוגמה הבאה. בכיתה עם בנאי ושיטה ציבורית הוכרזו בקוד. הבונה ידפיס הודעה כאשר נוצר אובייקט משותף חדש עם הבונה. ה לְהַצִיג() שיטה תדפיס הודעות המבוססות על אובייקט המצביע המשותף המתקשר. כאן, אובייקט המצביע המשותף הראשון נוצר מבלי לקרוא לבנאי. אובייקט המצביע המשותף השני נוצר על ידי קריאה לבנאי. המצביע המשותף השלישי נוצר על ידי הקצאת המצביע המשותף הראשון. ה לְהַצִיג() שיטה נקראה שלוש פעמים באמצעות שלושה אובייקטים מצביעים משותפים.







// כלול ספריות נחוצות

#לִכלוֹל

#לִכלוֹל

באמצעות שם שמות;

// הגדירו את הכיתה
classMyClass{
פּוּמְבֵּי:
// הכריז על הבונה
הכיתה שלי() {
עֲלוּת<<״קוראים לבנאי. n';
}
// הכריז על שיטה להדפסת טקסט
voidDisplay(string str)
{
עֲלוּת<<'שיטת Display () נקראת מתוך'<<עמ<<'מצביע. n';
}
};

תוך()
{
// אתחל shared_ptr מבלי להתקשר לבנאי
shared_ptr p1=make_shared();
p1->לְהַצִיג('ראשון');
// אתחל shared_ptr על ידי התקשר לבנאי
shared_ptr p2=shared_ptr(newMyClass);
p2->לְהַצִיג('שְׁנִיָה');

// אתחל shared_ptr לפי הקצאה
shared_ptr p3=p1;
p3->לְהַצִיג('שְׁלִישִׁי');
לחזור 0;
}

תְפוּקָה:



הפלט הבא יופיע לאחר ביצוע הקוד לעיל. הבונה התקשר בזמן יצירת האובייקט השני בלבד. אז המסר של הקונסטרוקטור הודפס רק פעם אחת:







דוגמה 2: הדפס את מיקום המצביע המשותף המאוחסן

הפונקציה get () מצביע משותף משמש להחזרת מיקום המצביע המשותף המאוחסן. הדוגמה הבאה תדפיס את המיקום של הרמזים המשותפים המאוחסנים שנוצרו על ידי המחלקה והפונקציה. כאן הוגדרה מחלקה עם קונסטרוקטור שישמשו ליצירת מצביע משותף. הוכרזה פונקציה ליצירת מצביע משותף והדפסת מיקום המצביע המשותף באמצעות הפונקציה get (). בקוד זה נוצר המצביע המשותף הראשון באמצעות המחלקה, המצביע המשותף השני נוצר באמצעות הפונקציה, והמצביע המשותף השלישי נוצר על ידי הקצאת המצביע הראשון.

// כלול ספריות נחוצות

#לִכלוֹל

#לִכלוֹל

באמצעות שם שמות;

// הגדירו את הכיתה
classMyClass
{
פּוּמְבֵּי:
// הכריז על הבונה
הכיתה שלי() {
עֲלוּת<<״קוראים לבנאי. n';
}
};
// הגדר את הפונקציה לאתחול המצביע
voidInit_shared_ptr()
{
shared_ptr p2(newMyClass);
עֲלוּת<<p2.לקבל() <<' n';
}

תוך()
{
// אתחל shared_ptr על ידי התקשר לבנאי
shared_ptr p1=shared_ptr(newMyClass);
עֲלוּת<<p1.לקבל() <<' n';

// אתחל shared_ptr על ידי התקשרות לפונקציה
Init_shared_ptr();

// אתחל shared_ptr לפי הקצאה
shared_ptr p3=p1;
עֲלוּת<<p3.לקבל() <<' n';
לחזור 0;
}

תְפוּקָה:



הפלט הדומה הבא יופיע לאחר ביצוע הקוד לעיל. בפלט, הערך המוחזר של הפונקציה get () עבור המצביעים המשותפים הראשון והשלישי זהים. עם זאת, המצביע המשותף השני שונה:

דוגמה 3: ספרו את אובייקטים המצביע המשותף

הדוגמה הבאה מתארת ​​דרך לספור את מספר האובייקטים שהצביע משותף הצביע עליהם לאחר יצירה והרס של המצביע. בכיתה עם קונסטרוקטור הוכרזה בקוד. המצביע המשותף הראשון נוצר באמצעות הכיתה, והמצביע המשותף השני נוצר באמצעות המצביע המשותף הראשון. מספר האובייקטים שאליהם הצביעו שני המצביעים המשותפים לפני ואחרי קריאת הפונקציה reset () הודפס מאוחר יותר.

// כלול ספריות נחוצות

#לִכלוֹל

#לִכלוֹל

באמצעות שם שמות;
// הגדירו את הכיתה
classMyClass{
פּוּמְבֵּי:
// הכריז על הבונה
הכיתה שלי() {
עֲלוּת<<״קוראים לבנאי. n';
}
};
תוך()
{
// אתחל את ה- shared_ptr הראשון על ידי קריאה לבנאי
shared_ptr p1(newMyClass);

// הצג את מספר האובייקטים shared_ptr לפי המצביע הראשון
עֲלוּת<<'p1 מצביע על'<<p1.use_count() <<אובייקט (ים). n';
// אתחל את ה- shared_ptr השני באמצעות ה- shared_ptr הראשון
shared_ptr p2(p1);
// הצג את מספר האובייקטים shared_ptr לפי המצביע הראשון והשני
עֲלוּת<<'p2 מצביע על'<<p2.use_count() <<אובייקט (ים). n';
עֲלוּת<<'p1 מצביע על'<<p1.use_count() <<אובייקט (ים). n';
// הסר את הבעלות על המצביע הראשון מהאובייקט shared_ptr
p1.אִתחוּל();
// הצג את מספר האובייקטים shared_ptr לפי המצביע השני
עֲלוּת<<'p2 מצביע על'<<p2.use_count() <<אובייקט (ים). n';
לחזור 0;
}

תְפוּקָה:

הפלט הבא יופיע לאחר ביצוע הקוד לעיל. המצביע הראשון, p1 , מצביע על אובייקט אחד לאחר הבריאה. לאחר יצירת המצביע השני, p2 בעזרת המצביע הראשון, p1 , שני המצביעים מצביעים על שני אובייקטים לשיתוף המצביע. לאחר קריאת הפונקציה reset () עבור המצביע, p1 , חפץ אחד נהרס, והמצביע, p2 , מצביע כעת על אובייקט אחד בלבד.

סיכום:

מטרות השימוש במצביע משותף ב- C ++ הוסברו במדריך זה באמצעות דוגמאות פשוטות. יצירת מצביעים משותפים בדרכים שונות, שמירת מיקום המצביע המשותף וספירת מספר האובייקטים שהצביעו על ידי המצביעים המשותפים. אני מקווה שמקודדי C ++ יוכלו להשתמש במצביע המשותף בקוד שלהם לאחר קריאת הדרכה זו.