2012-10-21 27 views
8

Özel durum nesnesinin nasıl oluşturulduğunu bilmek istiyorum. ve işleyici işlev parametresinin neden yerleşik olmayan bir başvuru kaynağı olabilir?Özel durum nesnesi ömür boyu

class E{ 
    public: 
    const char * error; 
    E(const char* arg):error(arg){ 
    cout << "Constructor of E(): ";} 

    E(const E& m){ 
     cout << "Copy constructor E(E& m): " ; 
     error=m.error; 
    } 
}; 



int main(){ 
try{ 
    throw E("Out of memory"); 

} 
catch(E& e){cout << e.error;} 

} 

Çıktı: E() ait Yapıcı: Örneğin

Bellek yetersiz

yüzden throw E("out of memory") var ve E("out of memory") sadece geçici bir nesnedir ve hiçbir nesne vardır hiçbir kopya kurucusu çalıştırılmadığı için E("out of memory") dışında oluşturuldu. Yani bu E("out of memory") sadece geçici bir nesne olsa bile, bir construder referansı alan bir işleyiciye sahibim.

Bunun neden yapıldığını bana açıklayabilir misiniz?

+1

. Yani bu E ("bellekten çıkmış") sadece geçici bir nesne olsa bile, bende olmayan bir referansa sahip bir işleyicim var - http://en.wikipedia.org/wiki/Copy_elision –

+0

@ skwllsp: Bu optimizasyondan kaynaklanıyor. Bu, geçici nesnenin yaratılmadığı ve argümanın doğrudan istisna nesnesine aktarıldığı anlamına mı geliyor? – AlexDan

cevap

10

Özel durum nesnesinin nasıl oluşturulduğunu bilmek ister misiniz?

Bunu yaptığınızda:

yerel olarak (tip E) bir nesne oluşturmak
throw E("Out of memory"); 

. Atma işlemleri, bu nesneyi standart tarafından tanımlanmayan bazı özel bellek konumuna kopyalar. Böylece atılan nesne kopyalanabilir olmalıdır.

Not: Derleyicinin kopyayı en iyi duruma getirmesine ve doğrudan özel konumda oluşturmasına izin verilir. Bu yüzden kopyalanmamasının nedeni, derleyicinin kopyayı ortadan kaldırmasıdır (bu yüzden artık yerel değil). Kopya kurucuyu özel yapmaya çalışın ve şimdi derleme başarısız olacaktır.

ve neden işleyici işlevi parametresi yerleşik olmayan bir başvuru kaynağı olabilir?

catch(E& e) 

Bunu kopyalandı özel konumda objenin bir başvuru alıyorsanız: nesneyi yakalamak

. Onun bir const (veya geçici) değeri değil, böylece normal bir referansı olabilir. Hiçbir kopya kurucusu çalıştırılmadığından

+0

Bu catch referansı ne kadar süreyle iyidir? – xaxxon

+0

@xaxxon: http://stackoverflow.com/a/1654187/14065 –