Menu
Coddy logo textTech

זיכרון דינמי באמצעות 'new'

חלק מהיחידה לוגיקה וזרימת תוכנית במסלול ה-C++ של Coddy. שיעור 6 מתוך 56.

עד כה עבדת עם מצביעים שמצביעים על משתנים שכבר נוצרו בתוכנית שלך. אבל מה אם תצטרך ליצור משתנים בזמן שהתוכנית שלך פועלת? כאן הקצאת זיכרון דינמית באמצעות מילת המפתח new הופכת להכרחית.

מילת המפתח new מאפשרת לך להקצות זיכרון למשתנה בערימה במהלך הרצת התוכנית. בניגוד למשתנים רגילים שנוצרים במחסנית, זיכרון שהוקצה באופן דינמי נשאר עד שתשחרר אותו במפורש.

int* ptr = new int;  // מקצה זיכרון למספר שלם
*ptr = 42;           // מקצה ערך לזיכרון שהוקצה

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

הקצאת זיכרון דינמית שימושית במיוחד כשלא ידוע לך כמה זיכרון תצטרך עד לזמן הריצה, או כשאתה צריך שמשתנים יתקיימו מעבר לתחום שבו הם נוצרו. הגמישות הזאת הופכת את new לכלי רב־עוצמה לבניית תוכניות מורכבות יותר.

challenge icon

אתגר

קל

צרו תוכנית שמדגימה הקצאת זיכרון דינמית באמצעות מילת המפתח new כדי להקצות זיכרון למשתנה במהלך ביצוע התוכנית.

הקלט הבא יסופק:

  • ערך של מספר שלם לאחסון בזיכרון שהוקצה באופן דינמי

על התוכנית שלכם:

  1. להשתמש במילת המפתח new כדי להקצות זיכרון למספר שלם באופן דינמי
  2. לאחסן את המצביע שמוחזר על ידי new במשתנה מצביע בשם numPtr
  3. להשתמש באופרטור ביטול ההפניה כדי להציב את ערך הקלט בזיכרון שהוקצה באופן דינמי
  4. להדפיס את הערך המאוחסן בזיכרון שהוקצה באופן דינמי באמצעות ביטול הפניית המצביע
  5. להדפיס את כתובת הזיכרון המאוחסנת במצביע

השתמשו בפורמט הפלט המדויק הבא:

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;
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה לוגיקה וזרימת תוכנית

תרגלו בעצמכם: קומפיילר C++ אונליין