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
- 1. Szablon przeciążający ostream operatora
- 2. C++ Lambda nie ma operatora()
- 3. in_array nie ma żadnego sensu
- 4. Otrzymuję błąd segmentacji zamiast wyjątku
- 5. Błąd Xcode: wywoływanie -display nie ma żadnego efektu
- 6. C++, Jak mogę wywołać przeciążony operator wyodrębniania klas klasy pochodnej?
- 7. error: 'ostream' nie wymienia typu
- 8. HttpURLConnection setConnectTimeout() nie ma żadnego efektu
- 9. Czy przeciążony operator delete ma domyślne parametry?
- 10. ma int mieć operatora ==
- 11. Zamknięcie obiektu ByteArrayOutputStream nie ma żadnego efektu?
- 12. Atrybut CKReference .DeleteSelf nie ma żadnego efektu
- 13. xcode 9 nie ma żadnego symulatora urządzenia
- 14. GWT DataGrid setLoadingIndicator nie ma żadnego efektu
- 15. unordered_map - Funkcja skrótu nie ma żadnego efektu
- 16. atrybut HandleError nie ma żadnego wpływu
- 17. Notebook R: opts_chunk nie ma żadnego efektu
- 18. interaktywna powłoka php nie ma żadnego wyjścia?
- 19. pthread (błąd segmentacji)
- 20. Błąd segmentacji w PHP?
- 21. Qshow Błąd segmentacji
- 22. "Błąd segmentacji" podczas dekodowania pliku
- 23. type_traits błędów segmentacji z std :: string
- 24. Niestandardowe ostream
- 25. Błąd segmentacji haskell z silnikiem
- 26. Kod PHP generuje błąd segmentacji
- 27. operatora przecinek, jeśli warunek
- 28. Typ elementu JSX nie ma żadnego konstruktu ani sygnatur połączeń
- 29. Aktywuj profil Maven, jeśli nie aktywowano żadnego innego profilu
- 30. Dlaczego nie ma operatora [] dla std :: list?
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