2013-04-03 16 views
6

W powyższym kodzie, jeśli zaznaczona linia zostanie usunięta, wystąpi błąd błędu segmentu, czy ktoś może wyjaśnić dlaczego?Przeciążony błąd segmentacji operatora ostream, jeśli nie ma żadnego endl

+1

Dlaczego nikt nie dba o sprawdzenie kodu? Kompilator powinien był Cię uprzedzić o takim błędzie - "... ostrzeżenie: brak instrukcji return w funkcji zwracającej non-void [-Wreform-type]" Patrz http://liveworkspace.org/code/2ygK20$1 } ^ – SChepurin

Odpowiedz

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? 
} 

nie jest manadatory. Segfault jest spowodowane tym, że nie wracają os

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

jest niezdefiniowane zachowanie, jeśli nie zwróci ostream. endl spłukuje tutaj swój os. Dlatego wydaje się, że to działa.

EDIT: Dlaczego to działa w tym przypadku według Bo Persson

OS < < endl; to kolejne wywołanie, które faktycznie zwraca os przez umieszczając go "tam, gdzie oczekiwana jest wartość zwracana" (prawdopodobnie rejestr). Gdy kod zwraca inny poziom do głównego, odniesienie do os to nadal tam

+0

niejawne 'int' (?), które zostanie zwrócone, jeśli nic nie zostanie określone lub jego wartość będzie w jakiś sposób znormalizowana? –

+4

Nie ma tu żadnego niejawnego 'int'. Jest to dość wyraźnie określone jako zwracające 'ostream &'. Więc bez instrukcji "return" otrzymujesz wszystko, co stanie się w odpowiednim miejscu na stosie po funkcji. Tak się składa, że ​​z 'os << endl' tam, te śmieci są czymś, co nie powoduje awarii. – BoBTFish

+2

@honk Nie ma żadnego niejawnego 'int' w C++. Niepowodzenie zwrotu z funkcji innej niż "po prostu" jest po prostu nieokreślonym zachowaniem, kropką. – Angew

Powiązane problemy