2013-04-03 23 views
6

Yukarıdaki kodda, işaretli çizgi kaldırılırsa, bir segment hatası hatası olur, biri nedenini açıklayabilir mi?Aşırı yüklenen ostus operatörü segmentasyonu hatası endl

+1

? Derleyici böyle hata hakkında size uyarmalıydım - "... uyarı: olmayan boşluk [-Wreturn tipi] dönen fonksiyonunda hiçbir Dönüş ifadesi" Bkz http://liveworkspace.org/code/2ygK20$1 } ^ – SChepurin

cevap

16
ostream& operator << (ostream &os, const foo &f) { 
    for (int i = 0; i < f.a.size(); ++i) 
     os << f.a[i] << " "; 
    os << endl; // why is this line a must? 
} 

manadatory değildir. Eğer ostream dönmemesi halinde tanımsız davranıştır os

ostream& operator << (ostream &os, const foo &f) { 
    for (int i = 0; i < f.a.size(); ++i) 
     os << f.a[i] << " "; 
    return os; // Here 
} 

dönen olmadığı için segfault kaynaklanır. endl, os ürününüzün burada yıkanıyor. Bu yüzden çalışıyor gibi görünüyor.

DÜZENLEME: Bu Bo Persson

os < < endl göre bu durumda çalışıyor Neden; aslında "geri dönüş değeri beklenen" (muhtemelen bir kayıt olması) yerleştirerek, tarafından os döndüren başka bir operatör çağrısıdır. Kod ana başka seviyesini döndürür , os referansı hala orada

kimsenin söz konusu kodunu kontrol etmek umurunda Neden
+0

mi Hiçbir şey belirtilmediyse veya değeri bir şekilde standardize edilirse, iade edilen int (int) (?)? –

+4

Burada hiçbir dolaylı int var. Oldukça açıkça 'ostream &' dönüşü olarak belirtilmiştir. Yani bir 'return' ifadesi olmadan, fonksiyondan sonra yığınta doğru yerde ne tür şeylerin olduğunu görürsünüz. Öyle ki, "os << endl" ile, bu çöplük bir çarpışmaya neden olmayan bir şeydir. – BoBTFish

+2

@honk C++ 'da hiçbir dolaylı' int 'yoktur. 'Void' olmayan bir işlevden bir şey döndürmemek, yalnızca tanımlanmamış davranış, dönemdir. – Angew

İlgili konular