04-07-2008, 11:23
|
|
|
חבר מתאריך: 26.05.08
הודעות: 120
|
|
אחי, אם לא הייתי צעיר מת הייתי יודע שאפשר להגדיר בנוהל ל-new להחזיר NULL במקום לזרוק
חפש בגוגל new nothrow וכנראה תלמד משהו חדש.
מצד שני, new ו-delete קוראים ל-constructor-ים ול-destructor-ים, ו-xalloc ו-free לא.
מה עדיף?
קוד:
C *p = new(std::nothrow) C;
if (p == NULL) {
whatever;
}
...
delete p;
או הקוד הנפלא שאתה מציע לנו:
קוד:
C *p = static_cast<C*>(malloc(sizeof(C)));
if (p == NULL) {
whatever;
}
p->C::C();
...
p->~C();
free(p);
וזה אפילו לא קוד תקני, אלא טריק שעובד ב-VCPP7. כדי לקרוא ל-constructor על זיכרון שהוקצה ידנית, תצטרך להשתמש ב-placement new:
קוד:
C *p = static_cast<C*>(malloc(sizeof(C)));
if (p == NULL) {
whatever;
}
C *p2 = new(p) C();
...
p->~C();
free(p);
אם אתה רוצה לקרוא ל-constructor, אתה חייב להשתמש ב-new. מצד שני, new לא חייב לזרוק exception אם ההקצאה נכשלה. אתה יכול לבחור איזו התנהגות שלו אתה מעדיף. ברכות.
|