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
Odpowiedz
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
niejawne 'int' (?), które zostanie zwrócone, jeśli nic nie zostanie określone lub jego wartość będzie w jakiś sposób znormalizowana? –
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
@honk Nie ma żadnego niejawnego 'int' w C++. Niepowodzenie zwrotu z funkcji innej niż "po prostu" jest po prostu nieokreślonym zachowaniem, kropką. – Angew
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