2012-01-28 30 views
6

Aşağıdaki kodu düşünün atıldığında Yokedici aramadı:bir istisna

#include <iostream> 
using namespace std; 

class Test { 
    static int count; 
    int id; 
public: 
    Test() { 
    count++; 
    id = count; 
    cout << "Constructing object number " << id << endl; 
    if(id == 4) 
     throw 4; 
    } 
    ~Test() { cout << "Destructing object number " << id << endl; } 
}; 

int Test::count = 0; 

int main() { 
    try { 
    Test array[5]; 
    } catch(int i) { 
    cout << "Caught " << i << endl; 
    } 
} 

Yukarıdaki kod aşağıdaki çıktıyı üretir:

Constructing object number 1 
Constructing object number 2 
Constructing object number 3 
Constructing object number 4 
Destructing object number 3 
Destructing object number 2 
Destructing object number 1 
Caught 4 

Ben nesne kapsam dışında olunca yıkıcılar hep denir sanıyordum istisnalar atıldığında bile. Bu durumda neden Test örneğinin 'yıkıcısı' aranmıyor?

+0

Sorunuzu Stack Overflow için daha uygun bir şeye düzenledim. Lütfen ileride başvurmak için [soru yönergelerini] (http://stackoverflow.com/questions/how-to-ask) takip edin veya sorunuzun yanıtsız/kapalı olabilir. –

cevap

8

Sen 5Test nesneleri dizisini oluşturan ancak sen 3tam nesneleri oluşturduktan sonra bir özel durum, istisna 4 inci nesnenin kurucusu iken atılır. 10 th nesnesinin yapısı, kurucunun kapanış ayrağına ulaşılana kadar tamamlanmamıştır.

yığın bunları adı hiçbir zaman için 4 inci ve 5 inci nesne yıkıcı inşa hiçbir zaman için, oluşturuldukları ters sırada bu 3 tamamen inşa nesneler için yıkıcı çağrı unwinds.

Kural dışı durum şöyledir:
Bu kapsamdaki tamamen oluşturulmuş tüm nesneler için bir istisna atılan atıcılar çağrıldığında çağrılır.
Tamamen oluşturulmuş bir nesne, herhangi bir istisna olmaksızın kurucusu temiz bir şekilde çağrılmış olan nesnedir. Bunun yerine id sonra cout deyimi writting

+0

Bu [Haftanın Guru maddesi (# 66)] (http://www.gotw.ca/gotw/066.htm) özellikle bu durumla ilgilidir. –

+0

teker teker - sadece 3 tamamen inşa edilmiş nesne var, bu yüzden sadece 3 yıkıcı denir. –

+0

@ChrisDodd: Oh iyi göründü. İzleri okudum. –

3

= olarak aşağıda belirtilen sayısı: -

id = count; 
    cout << "Constructing object number " << id << endl; 
    if(id == 4) 
    throw 4; 

sen atmak deyimi sonra yazılı olması gerekirdi. Bu ne oldu daha iyi bir resmi vermiş olurdu. Bu gibi: -

Test() { 
count++; 
id = count; 
if(id == 4) 
    throw 4; 
cout << "Constructing object number " << id << endl; 
    } 

o/p olurdu: - obje numarası 2 oluşturma obje numarası 3 imha obje numarası 3 imha obje numarası 2 imha obje numarası 1 oluşturma amacı sayısı 1 oluşturma Yakalandı 4