C++/זיכרון דינמי: הבדלים בין גרסאות בדף
תוכן שנמחק תוכן שנוסף
Ybungalobill (שיחה | תרומות) |
Ybungalobill (שיחה | תרומות) אין תקציר עריכה |
||
שורה 1:
{{C++}}
== מהי הקצאת זיכרון דינמית ==
;הקצאת זיכרון דינמית: היא פעולה של הקצאת זיכרון
==
מאחר ובשפת C++ יש תמיכה מלאה בכל הספריות הסטנדרטיות של C,
כיוון שב־C++ יש כלים
ב־C++ מקצים ומשחררים זיכרון באופן דינמי באמצעות האופרטורים new ו-delete עבור משתנים בודדים ו-[]new ו-[]delete עבור מערכים.
=== משתנה בודד ===
להקצאת זיכרון עבור משתנה בודד נשתמש באופרטור new כאשר אחריו נרשום את סוג המשתנה. אופרטור זה מחזיר מצביע למשתנה זה, לכן עלינו לשמור אותו כדי להשתמש בו. דוגמה:
<div style="
cin >> *ptr;
/*...*/
כך נקצה משתנה מטיפוס int בזיכרון הדינמי ונשמור את המצביע עליו למשתנה ptr. לאחר השימוש בזיכרון זה נשחרר אותו ע"י האופרטור delete.
▲</pre></div>
=== מערך ===
להקצאת מערך בזיכרון הדימני נשתמש באופטור []new. כדי להקצות מערך, בדומה להקצאת משתנה בודד, עלינו לציין את הטיפוס של האיברים במערך ובנוסף את גודל המערך. המצביע שיוחזר ע"י האופרטור []new יצביע לתחילת המערך ובו נשתמש כדי לשחרר את הזיכרון באמצעות []delete בתום השימוש. הנה קטע קוד לדוגמה אשר קולט מהמשתמש את גודל המערך ואת איבריו:
<div style="
cin >> length;
for(int i = 0; i < length; i++)
cin >> array[i];
/*...*/
delete[] array;
</
שימו לב שבזכות ההקצאה הדינמית, אנו יכולים לציין את גודל המערך לא בהכרח כקבוע, כך נוכל לקבוע בזמן ריצת התוכנית את גודל הזיכרון המוקצה.
▲int *array=new int[length];
▲delete array;
▲int *myint=new int;
▲int *myarray=new int[length];
== פרטים על האופרטורים new ו-delete ==
* כאשר אין אפשרות להקצות את הזיכרון הנדרש האופרטור new יחזיר מצביע 0 (NULL) או יזרוק חריגה bad_alloc בהתאם להגדרות המהדר.
* זיכרון שהוקצה ע"י new צריך לשחרר ע"י delete וזיכרון שהוקצה ע"י []new צריך לשחרר ע"י []delete, אחרת אופן פעולת התוכנית לא מוגדר והיא עלולה לקרוס.
* אם נשתמש בפונקציות של C להקצות זיכרון, אין לשחרר אותו באמצעות אופרטורי ++C, ולהיפך.
* על אף שלא ניתנת הודעת שגיאה על אי שחרור זיכרון שהוקצה ומערכת ההפעלה תשחרר, בדרך כלל, את הזיכרון באופן אוטומטי בעת סיום פעולת התוכנית, רצוי לשחרר את הזיכרון ע"י delete ישירות לאחר סוף השימוש בו. הסיבה לכך היא מניעת דליפת זיכרון וצורך להפעיל את המפרקים של המחלקות (למדו בהמשך).
* נוכל לציין את גודל הזיכרון המוקצה למערך שווה ל-0. דבר זה לא נחשב לשגיאה. זיכרו כי נצטרך לשחרר זיכרון זה כמו כל זיכרון אחר, הסיבה לכך היא המבנה של הערימה.
== שינוי גודל הזיכרון שהוקצה ==
|