• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

SIGBUS on thread : -1717046736

Object Storage Arubacloud
0 głosów
112 wizyt
pytanie zadane 29 września 2020 w C i C++ przez RufinB Obywatel (1,830 p.)

Gdy kompiluje program na jednym kompilatorze pojawia sie komunikat:

SIGBUS on thread : -1717046736

Na innym zaś nie ma tego problemu i kompiluje się dobrze co może powodować ten błąd

#include <iostream>
using std::cout;
using std::endl;
class Tuplyw_czasu;

std::ostream& operator<<(std::ostream&, const Tuplyw_czasu&);

class Tuplyw_czasu{
	unsigned long long czas;
	public:
	Tuplyw_czasu(unsigned long long a):czas{a}{
		}
	Tuplyw_czasu operator+(const Tuplyw_czasu& temp){
		return Tuplyw_czasu{czas+temp.czas};
	  }
	  friend std::ostream& operator<<(std::ostream&, const Tuplyw_czasu&);
};

Tuplyw_czasu operator"" _d(unsigned long long t){
	return Tuplyw_czasu{t*3600*24};
}

Tuplyw_czasu operator"" _godz(unsigned long long t){
	return Tuplyw_czasu{t*3600};
}

Tuplyw_czasu operator"" _min(unsigned long long t){
	return Tuplyw_czasu{t*60};
}

Tuplyw_czasu operator"" _sek(unsigned long long t){
	return Tuplyw_czasu{t};
}

int main(){
	Tuplyw_czasu	czas = 3_sek + 1_min;
	cout << "Krotszy czas = "<< czas << endl;

	czas =  24_godz + 2_d + 5_godz;
	cout << "Dluzszy czas = " << czas << endl;  
}
	
std::ostream& operator<<(std::ostream& entrance, const Tuplyw_czasu& temp){
  entrance<<"To w sekundach czas = "<<temp.czas<<endl;
}

 

komentarz 29 września 2020 przez tkz Nałogowiec (42,000 p.)
Sam SIGBUS oznacza problem z przydzieleniem pamięci.
To jest cały kod?
Czym kompilujesz?
Możliwe, że to kwestia przypadku, spróbuj zresetować komputer, może adresy się poustawiają odpowiednio.

1 odpowiedź

0 głosów
odpowiedź 29 września 2020 przez TOM_CPP Pasjonat (22,640 p.)
edycja 29 września 2020 przez TOM_CPP

W przeładowaniu operatora << nic nie zwracasz ( brak return entrance;) co może powodować SIGBUS, gdyż w instrukcji

cout << "Krotszy czas = "<< czas << endl;

ostatni człon ( endl ) jest parametrem funkcji operator<<(endl) wywoływanej na rzecz obiektu typu void , a nie typu ostream (gdyż nic nie jest zwracane z przeładowania operatora), co prowadzi do UB.

komentarz 29 września 2020 przez tkz Nałogowiec (42,000 p.)
Jak może być wysyłane w nieokreślone miejsce skoro jest wywoływane na rzecz ostream'a? Poza tym jest określone gdzie, przez pierwszy argument w funkcji.
komentarz 29 września 2020 przez TOM_CPP Pasjonat (22,640 p.)

Trochę to za bardzo uprościłem. W rzeczywistości brak zwracanej wartości w tym przypadku prowadzi do Undefined Behavior, czyli może równie dobrze spowodować błąd SIGBUS.

komentarz 29 września 2020 przez Oscar Nałogowiec (29,320 p.)
edycja 29 września 2020 przez Oscar

Może wyjaśnie to za bardzo prosto, ale może będą to czytać początkujący. Zapis

cout << costam << cosinnego << jeszczecos << endl;

nie oznacza wywołanie jakiegoś tajemniczego operatora wieloargumentowego, tylko serię wywołań operatora dwuargumentowego, gdzie wynik wcześniejszego działania jest jednym z argumentów następnego. W zależności od tzw wiązania operatora gupowanie jest od lewej lub prawej.

W tym przypadku będzie to coś takiego:

(((cout << costam) << cosinnego) << jeszczecos) << endl;

W przypadku przeciążania (a tak jest z <<) każdy operator to może być inna funkcja i jeśli któraś zwróci zły wynik to następna dostanie zły argument.

Może sprawdź, czy twój kompilator nie potrafi generować ostrzeżeń.

 

Trochę podejrzana wydaje mi się też linijka w operatorze +. temp.czas oznacza dostęp do prywatnego pola innego obiektu. Pamiętam, że początkowo (w początkach C++) kompilatory to puszczały (w sumie ta sama klasa), ale później przestały, bo to jednak jest inny obiekt, nie ten identyfikowany przez this.

komentarz 29 września 2020 przez tkz Nałogowiec (42,000 p.)

Trochę podejrzana wydaje mi się też linijka w operatorze +. temp.czas oznacza dostęp do prywatnego pola innego obiektu. Pamiętam, że początkowo (w początkach C++) kompilatory to puszczały (w sumie ta sama klasa), ale później przestały, bo to jednak jest inny obiekt, nie ten identyfikowany przez this.

Który kompilator tego nie puszcza? Kwestią, która by mogła zaważyć jest jedynie opcja użycia {}, zamiast (). Poza tym jest to operator klasy, nie jakiś zewnętrzny dodatek. Reszta jest jak najbardziej poprawna. 

Może wyjaśnie to za bardzo prosto, ale może będą to czytać początkujący. Zapis

C/C++

Kopiuj

?

1

cout << costam << cosinnego << jeszczecos << endl;

nie oznacza wywołanie jakiegoś tajemniczego operatora wieloargumentowego, tylko serię wywołań operatora dwuargumentowego, gdzie wynik wcześniejszego działania jest jednym z argumentów następnego. W zależności od tzw wiązania operatora gupowanie jest od lewej lub prawej.

Z tego co mówi dokumentacja, ostream& operator<< jest operatorem jednoargumentowym. Od c++ 11 przyjmującym 17 przeciążeń. A cout jest obiektem ostream mimo wszystko. 

Podobne pytania

0 głosów
1 odpowiedź 287 wizyt
pytanie zadane 4 czerwca 2023 w C i C++ przez piotr_domanski Bywalec (2,080 p.)
0 głosów
0 odpowiedzi 190 wizyt
pytanie zadane 12 maja 2020 w C i C++ przez koszyk1 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 158 wizyt

92,625 zapytań

141,483 odpowiedzi

319,825 komentarzy

62,006 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...