2011-04-03 22 views
8

Olası Çoğalt:
throwing exceptions of objects on the stack, mem leak with new?C++ -The doğru atmak yolu ve yakalamak istisnalar

Eğernew operatör olmadan veya ile C++ istisnalar atmak mı? Çünkü her ikisi de bir istisna atardı.

void KillUnicorns() 
{ 
    throw IllegalActionException(); 
} 

int main() 
{ 
    try 
    { 
     KillUnicorns(); 
    } 
    catch (IllegalActionException e) 
    { 
     // Handle exception 
    } 
    return 0; 
} 

Aşağıdaki örnek bellek sızdırıyor mu?

void KillUnicorns() 
{ 
    throw new IllegalActionException(); 
} 

int main() 
{ 
    try 
    { 
     KillUnicorns(); 
    } 
    catch (IllegalActionException* e) 
    { 
     // Handle exception 
    } 
    return 0; 
} 

C++'da istisnalar atmanın doğru yolu nedir?

cevap

9

(bu istisna dilimleme engeller) Ve catchconst referansı ile aşağıdaki gibi olur:

catch (const IllegalActionException & e) 
{ // ^^^^ note const    ^^ note reference! 

} 

Kopyalamayı engeller. new'u önler ve böylece delete'u kullanarak kaydeder.

+1

Tek bir soru sorusu. Const IllegalActionException & e', 'IllegalActionException const & e' ile aynı sonucu veriyor mu? @ Martin'in yorumunda görüldüğü gibi. – Kevin

+2

@ Kevin: kondensin bir türe eklenmesini ya da postfing yapması bir stil meselesidir (her ikisini de görebilirsiniz). Sonuç aynıdır. –

8

Teknik olarak her ikisini de yapabilirsiniz.

Ama daha geleneksel atmak nesneler:

void KillUnicorns() 
{ 
    throw IllegalActionException(); 
} 

:
Ayrıca const referans olarak yakalamak not ben new kullanmadan istisna olacağını

try 
{ 
    KillUnicorns(); 
} 
catch (IllegalActionException const& e) 
{       // ^^^^^^^^ 
    // Handle exception 
} 
+5

+1. Eklemek için, bellek genellikle istisna nesneleri için ayrılmıştır. Dinamik ayırma yaparsanız, işaretçi için bu belleği kullanıyorsunuz, ancak yine de, uygulamanız bir tane kullanıyorsa, "standart" dinamik ayırmaya ("yığında") erişmeye çalışıyorsunuz demektir. Eğer istisnanın sebebi hafızanız bittiyse, bu ... büyük değil. Ayrıca elbette kendiniz için bir karışıklık yaratıyorsunuz w.r.t. daha sonra bu hafızayı boşaltmak. –