|
|
פרק
1 |
|
זיכרון
דינמי |
|
++C מספקת לנו שני אופרטורים בזיכרון
דינמי :new ו delete. אופרטורים אלו משמשים לתפוס זיכרון ולשחרר
זיכרון בזמן ריצה (פעולה).זיכרון דינמי הוא חלק חשוב בשביל
כמעט כל המתכנתים בעולם . (++c גם תומכת בזיכרון דינמי בפונקציות,
הנקראות ( ) malloc ו ( )free . פונקציות אלו נכללות בגלל
שפת c שהיא חלק משפת ++c.) בקוד של ++c אתה תצטרך להשתמש באופרטורים
new ו delete בהקצאת זיכרון דינמי מכוון שיש להם מספר יתרונות.האופרטור
new מאתר (תופס) זיכרון ומחזיר פויינטר להתחלה ,האופרטור delete
משחרר את הזיכרון שאותר מקודם ע"י new הצורה הכללית שלהם תיראה
כך.
|
|
P_VAR=NEW TYPE;
DELETE P_VAR;
|
|
|
הסבר: P_VARהוא משתנה פויינטר אשר מקבל פויינטר
לזיכרון אשר גדול מספיק להחזיק את הפריט מסוג TYPE.במקרה שאין
התראה זאת אומרת שאותר זיכרון.ובמקרה שאין איתור של זיכרון
ישנו כישלון המתריע על חריגה. במקרה של חריגה התוכנית אמורה
לטפל במצב זה , אם חריגה זו לא מטופלת ע"י התוכנית ,התוכנית
תיסתיים.דוגמא לתוכנית שתאתר זיכרון ע"מ לחזיק נתון מסוג אינטגר(int).
|
#include <iostream.h>
#include <new.h>
int main ( )
{
int *p;
try{
p= new int; //איתור מקום עבור האינט
}
catch(bad_alloc xa)
{
cout<<"allocation failure \n" ;
return 1;
)
*p = 100;
cout<<"at" <<p<<" ";
cout<<" is the value " << *p <<"\n";
delete p;
return 0 ;
}
|
|
|
הסבר: תוכנית זו מצרפת לP כתובת למחסנית אשר
גדולה מספיק להחזיק אינטרגר(int),לאחר מכן מצרף לזיכרון זה
את הערך 100 ומראה את התוכן של הזיכרון על המסך ,לבסוף משחרר
את הזיכרון הדינמי .האופרטור delete חייב שיופיע לפניו פויינטר
אשר אותר ע"י new , שימוש בפויינטר שונה אם delete יצור בעיות
ריצניות ,כמו קריסת התוכנית .למרות שnew וdelete מבצעים בצורה
דומה כמו הפונקציות כמו ( )malloc ו ( )free יש להם מספר יתרונות.יתרון
ראשון new בצורה אוטומטית מאתר מספיק זיכרון בכדי להחזיק אובייקט
מסוג ספציפי ,אתה לא צריך להשתמש באופרטור sizeof , מכוון
שהגודל מותאם אוטומטית ,פוסל כל אפשרות לטעות בבקשה .יתרון
שני new אוטומטית מחזיר פויינטר לאותו סוג ספציפי.עדיף לא
לערבב בין new ו delete לבין ( )malloc ו ( )free באותה התוכנית
אין שום אחריות לכך שיתאימו.
|
הגדרת זיכרון עבור וקטורים
|
|
|
|
|
אתה יכול לאתר זיכרון עבור וקטורים ע"י שימוש
ב new לפי נוסחה כללית זו :
|
|
P_VAR = NEW ARRAY_TYPE[SIZE];
|
|
|
כאן size מגדיר את מספר האלמנטים בוקטור,בכדי
לשחרר את הוקטור יש להשתמש בdelete כך :
|
DELETE [ ] P_VAR;
|
|
|
כאן ה [] בשימוש delete הוקטור משתחרר. הדוגמא
הבאה תאתר 10 אלמנטים וקטורים מסוג אינטגר(int) .
|
|
#include <iostream.h>
#include <new.h>
int main ( )
{
int *p , i;
try {
p = new int [10];
}
catch (bad_alloc xa) {
cout << "allocation failure \n";
return 1;
}
for ( i = 0 ; i<10 ; i++)
cout << p[i] <<" " ;
delete [] p;
return 0;
}
|
|
|
שים לב מתי שהווקטור מאותר ע"י new הוא משוחרר
ע"י delete לא לשכוח את ה [ ].
|
|
הקודם
|
|
הבא
|
|
|