זיכרון דינמי באמצעות 'new'
חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 6 מתוך 56.
עד כה עבדת עם מצביעים שמצביעים על משתנים שכבר נוצרו בתוכנית שלך. אבל מה אם תצטרך ליצור משתנים בזמן שהתוכנית שלך פועלת? כאן הקצאת זיכרון דינמית באמצעות מילת המפתח new הופכת להכרחית.
מילת המפתח new מאפשרת לך להקצות זיכרון למשתנה בערימה במהלך הרצת התוכנית. בניגוד למשתנים רגילים שנוצרים במחסנית, זיכרון שהוקצה באופן דינמי נשאר עד שתשחרר אותו במפורש.
int* ptr = new int; // מקצה זיכרון למספר שלם
*ptr = 42; // מקצה ערך לזיכרון שהוקצהבדוגמה זו, new int מקצה מספיק זיכרון כדי לאחסן מספר שלם ומחזיר מצביע למיקום הזיכרון הזה. לאחר מכן אפשר להשתמש באופרטור ביטול ההפניה כדי להקצות ערכים למשתנה שהוקצה באופן דינמי ולגשת אליו, בדיוק כמו לכל מצביע אחר.
הקצאת זיכרון דינמית שימושית במיוחד כשלא ידוע לך כמה זיכרון תצטרך עד לזמן הריצה, או כשאתה צריך שמשתנים יתקיימו מעבר לתחום שבו הם נוצרו. הגמישות הזאת הופכת את new לכלי רב־עוצמה לבניית תוכניות מורכבות יותר.
אתגר
קלצרו תוכנית שמדגימה הקצאת זיכרון דינמית באמצעות מילת המפתח new כדי להקצות זיכרון למשתנה במהלך ביצוע התוכנית.
הקלט הבא יסופק:
- ערך של מספר שלם לאחסון בזיכרון שהוקצה באופן דינמי
על התוכנית שלכם:
- להשתמש במילת המפתח
newכדי להקצות זיכרון למספר שלם באופן דינמי - לאחסן את המצביע שמוחזר על ידי
newבמשתנה מצביע בשםnumPtr - להשתמש באופרטור ביטול ההפניה כדי להציב את ערך הקלט בזיכרון שהוקצה באופן דינמי
- להדפיס את הערך המאוחסן בזיכרון שהוקצה באופן דינמי באמצעות ביטול הפניית המצביע
- להדפיס את כתובת הזיכרון המאוחסנת במצביע
השתמשו בפורמט הפלט המדויק הבא:
Value: [value]
Address: [memory address]כתובת הזיכרון תוצג בפורמט הקסדצימלי, וכך C++ מציגה כתובות זיכרון עבור זיכרון שהוקצה באופן דינמי.
נסו בעצמכם
#include <iostream>
using namespace std;
int main() {
// קראו את הקלט
int value;
cin >> value;
// TODO: כתבו את הקוד שלכם למטה
// השתמשו ב-'new' כדי להקצות זיכרון דינמית עבור מספר שלם
// שמרו את המצביע במשתנה בשם 'numPtr'
// הציבו את ערך הקלט בזיכרון שהוקצה דינמית
// הציגו את התוצאה
cout << "Value: " << /* בצעו דה־רפרנס ל-numPtr כאן */ << endl;
cout << "Address: " << /* הדפיסו את הכתובת השמורה ב-numPtr */ << endl;
return 0;
}השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה לוגיקה וזרימת תוכנית
1מצביעים וזיכרון
מהו מצביע?אופרטור קבלת כתובתאופרטור ביטול הפניהמצביעי Nullמצביעים ומערכיםזיכרון דינמי באמצעות 'new'שחרור זיכרון באמצעות 'delete'סיכום — תרגול מצביעים2וקטורים (מערכים דינמיים)
היכרות עם std::vectorיצירת וקטורהוספת איבריםגישה לאיבריםגודל הווקטורמעבר על איברים באמצעות לולאת forלולאת for מבוססת טווחהסרת איבריםסיכום — פעולות על וקטורים5פרויקט: כלי לניהול מלאי
הגדרת הפרויקטהוספה ועדכון של פריטיםתרגלו בעצמכם: קומפיילר C++ אונליין