גודל מערכים בC++

tseliot

New member
גודל מערכים בC++

כשאני מורה לקומפיילר delete[] הוא מוחק את כל המערך מהזכרון- מכך שהוא יודע את גודל המערך. מדוע אם הוא יכול לאחזר את המידע הזה כשאני מבקש ממנו למחוק מערך, הוא לא יכול לאחזר אותו לפי בקשתי? כלומר מדוע המעקב אחרי גודל המערך צריך להתבצע על ידי אם כן ישנו בעצם מעקב פנימי?
 

vinney

Well-known member
הוא לא יודע את גודל המערך

הוא יודע את גודל בלוק הזכרון. כשאתה עושה
int *i = new int[80];​
לא מובטח לך שגודל הבלוק יהיה בדיוק גודל הint כפול 80, זה יכול להיות יותר (במקרים של int זה דוגמא פחות מוצלחת, אבל אם זה טיפוס לא אורדינלי, או char או כל מיני דברים אחרים בהם היישור הוא לא בדיוק לפי גודל הטיפוס, זה קורה כמעט תמיד אפילו).
 

tseliot

New member
עוד שאלה על מערכים...

האם בקוד הבא יש דליפת זיכרון, ואם כן מה הדרך הנכונה(תסלחו לי על הבורות, אני עדיין לא התאקלמתי לגמרי למעבר לC++)?
class A; A** theArray=new A*[10]; for(int i=0;i<10;i++) { theArray=new A(); } A** anotherArray=new A*[10]; for(int i=0;i<10;i++) { anotherArray=theArray; } //After some other lines... for(int i=0;i<10;i++) { delete anotherArray; } delete[] anotherArray;

בעיקרון אני אמור לבצע גם מחיקה למערך theArray,נכון? הבעיה היא שכשאני מנסה להורות
delete[] theArray; for(int i=0;i<10;i++) { delete anotherArray; } delete[] anotherArray;

אני מקבל הודעת שגיאה... יש פה משהו שאני מפספס?
 

vinney

Well-known member
לא הבנתי מה עשית

הרצתי את הקוד הבא, וזה עבד:
class A{ public: A(){}; ~A(){}; }; int main(void) { int i; A** theArray=new A*[10]; for(i=0;i<10;i++) { theArray=new A(); } A** anotherArray=new A*[10]; for(i=0;i<10;i++) { anotherArray=theArray; } //After some other lines... delete[] theArray; for(i=0;i<10;i++) { delete anotherArray; } delete[] anotherArray; return 0; }
 

tseliot

New member
הממ...

אם אתה אומר שזה תקני, כנראה שהטעות היא בקוד שבא במקום ההערה לפני המחיקה... תודה.
 

vinney

Well-known member
לא אמרתי שזה תקני

זה גם מאוד לא יפה. אבל זה בסדר מבחינת VC6.
 

codec

New member
2 בעיות

הראשונה בקוד הכתוב: ב-2 הלולאות אתה משחרר את אותו המערך: delete anotherArray השנייה היא בתכנון: שני המערכים מחזיקים מצביעים לאותם האובייקטים, לכן יש למחוק אותם רק דרך אחד המערכים (לא חשוב איזה).
 

tseliot

New member
הה?

אני חושב שלא הבנת למה התכוונתי בהודעה... מה שרשמתי בסוף:
delete[] theArray; for(int i=0;i<10;i++) { delete anotherArray; } delete[] anotherArray;

אמור להחליף את כל פקודות המחיקה בקוד שבא מעליו, לא לבוא בנוסף...
 

vinney

Well-known member
למה אתה עושה את זה בכלל?

למה אתה צריך שני מערכים שונים עם איברים זהים?
 

tseliot

New member
המערכים לא לגמרי זהים...

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

codec

New member
אז זה בסדר

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