עבור לתוכן

New, Delete / Malloc/Free על Struct - ב C++

Featured Replies

פורסם

שלום לכולם,

ידוע לי שעבור CLASS ניתן להשתמש ב NEW\DELETE שבעצם מבצעות הקצאת זכרון\שחרור זכרון וקריאה ל constructor/destructor

אבל מה עם STRUCT, האם גם שם ניתן להשתמש ב new/delete? כלומר להקצות אותו ישר על ה HEAP במקום MALLOC? ובאופן דומהב למחיקה.

תודה.

פורסם

ב-++C ההבדל בין class ו-struct הוא מינורי בלבד - ב-class נראות ברירת המחדל היא private, בעוד שב-struct היא public. למעט פרט זה שתי ההגדרות זהות לחלוטין, ואפשר להשתמש בהם באותו אופן (כן, ל-struct יכולות להיות מתודות, אפשר להשתמש בו בירושה, וכן אפשר להשתמש ב-new).

למעשה, ב-++C אפשר לעשות new על כל טיפוס, כולל פרימיטיביים (int, char וכד') ולא מומלץ להשתמש ב-malloc/free כלל (מותר, אבל עדיף new/delete).

ועוד הערת אגב אחרונה, למקרה שלא ידעת - לעולם אל תערבב בין malloc/free ו-new/delete. כלומר, אין בעיה להשתמש בשניהם באותה תכנית, אבל זכרון שהוקצה ע"י malloc חייב להיות משוחרר ע"י free, וזכרון שהוקצה ע"י new חייב להיות משוחרר ע"י delete (ועל הדרך, מערך שהוקצה באמצעות new חייב להיות משוחרר ע"י [] delete).

פורסם
  • מחבר

תודה רבה,

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

הרי NEW בעצם משתמש בקונסטרקטור, ו DELETE בדיסטרקטור.

וב CLASS אני מגדיר אותם בעצמי, ומרגיש "בטוח" להשתמש בהם.

אבל באם אלו לא מוגדרים, כמו ב struct שם אין לי את שני אלו, כשאני אעשה delete - מה יקרה? מחיקה שטחית? של פוינטרים ולא של class/struct אחרים?

אני מניח שכן, עם זאת לא הצלחתי לברר זאת ב-100%.

פורסם

אם אתה לא מגדיר ctor/dtor, הקומפיילר מגדיר לך אותם כברירת מחדל - כלומר, ctor/dtor שלא מקבלים פרמטרים ולא עושים כלום. זה נכון גם עבור struct וגם עבור class, כי כאמור הם שקולים (אני מניח שהקומפיילר מייעל את התהליך ובכלל לא טורח להפעיל את ה-ctor/dtor במקרה כזה).

במקרה של ctor, אם לא הגדרת אותו אז האיברים הפרימיטיביים (כולל מצביעים) של האובייקט פשוט לא יאותחלו (יכילו ערך אקראי), והאיברים שהם אובייקטים יאותחלו באמצעות הctor הדיפולטי (אם לא מוגדר כזה, אז הקומפיילר ידווח על שגיאה).

במקרה של dtor, אם לא הגדרת אותו אז פשוט ברגע מחיקת האובייקט לא יקרה כלום, למעט שייקרא ה-dtor של האיברים שלו שהם אובייקטים (כלומר, אם הוא מחזיק מצביע אז מצביע זה לא ישוחרר).

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים