Pawlo3 Temat założony przez niniejszego użytkownika |
Error in `./osoba': munmap_chunk(): invalid pointer: 0x08048e52 *** Przerwane » 2016-02-19 21:05:31 Robiłem przykład dt. przeładowania operatora () . Niestety, po 1-2 godzinach borykania się z problemami i skompilowaniem programu poprawnie, okazał się błąd. Oto log: Przed zmianami: Name: Mirek Surname: Rzemieślniczy Second name: Kamil Age: 30 Height: 180.5 Weight: 80.5 To return! *** Error in `./osoba': munmap_chunk(): invalid pointer: 0x08048e52 *** Przerwane [/log] #include <std> #define LIST class Osoba { private: char * imie; char * nazw; char * drim; int wiek; double wzrost; double waga; public: Osoba( void ) { imie =( char * ) malloc( 2 ); nazw =( char * ) malloc( 2 ); drim =( char * ) malloc( 2 ); } ~Osoba( void ) { free( imie ); free( nazw ); free( drim ); } void operator ()( char * _imie, char * _nazw, char * _drim, int _wiek, double _wzrost, double _waga ) { if( strcmp( _imie, "" ) ) { realloc( imie, sizeof( _imie ) + 1 ); this->imie = _imie; } if( strcmp( _nazw, "" ) ) { realloc( nazw, sizeof( _nazw ) + 1 ); this->nazw = _nazw; } if( strcmp( _drim, "" ) ) { realloc( drim, sizeof( _drim ) + 1 ); this->drim = _drim; } if( - 1 <= _wiek && _wiek <= 175 ) this->wiek = _wiek; if( _wzrost > 0 && _wzrost < 300 ) this->wzrost = _wzrost; if( _waga > 0 && _waga < 600 ) this->waga = _waga; } LIST friend ostream & operator <<( ostream & _screen, Osoba _os ); static const int nch_int = - 2; static const double nch_do = - 2.0; }; ostream & operator <<( ostream & _screen, Osoba _os ) { _screen << "Name: " << _os.imie << '\n'; _screen << "Surname: " << _os.nazw << '\n'; _screen << "Second name: " << _os.drim << '\n'; _screen << "Age: " << _os.wiek << '\n'; _screen << "Height: " << _os.wzrost << '\n'; _screen << "Weight: " << _os.waga << '\n'; cout << "To return!\n"; return _screen; }
int main( void ) { Osoba osoba; osoba( "Mirek", "Rzemieślniczy", "Kamil", 30, 180.5, 80.5 ); cout << "Przed zmianami:\n"; cout << osoba; cout << "Działa...\n"; osoba( "", "Rzerzuchowski", "(brak)", 34, 186.6, 80.65 ); cout << "Po zmianach:\n"; cout << osoba; cout << "Koniec!\n"; }
|
|
pekfos |
» 2016-02-19 21:10:13 if( strcmp( _imie, "" ) ) { realloc( imie, sizeof( _imie ) + 1 ); this->imie = _imie; } |
Ten kod nie ma żadnego sensu. |
|
Pawlo3 Temat założony przez niniejszego użytkownika |
» 2016-02-20 15:56:00 Czemu? |
|
pekfos |
» 2016-02-20 18:42:46 Porównujesz błędne dane z pustym łańcuchem, realokujesz te błędne dane, przy czym podajesz błędny rozmiar bloku i nigdzie nie zapisujesz nowego adresu. Po tym wszystkim, zamiast skopiować jakieś faktyczne dane, kopiujesz tylko wskaźnik (przekazany jako zły typ, btw). Do tego przypisujesz adres do wskaźnika z prawami własności, a wywołujesz tą funkcję z literałem tekstowym. Więcej błędów działania się już chyba nie da wprowadzić do tych kilku linii kodu. |
|
Monika90 |
» 2016-02-20 19:15:03 W ogóle podejście do problemu jest błędne. Do przechowywania napisów powinieneś użyć std::string. A jeżeli chodzi Ci o to by nauczyć się jak zarządzać pamięcią, to powinieneś napisać własną klasę string, zamiast 3 razy pisać ten sam kod. |
|
Pawlo3 Temat założony przez niniejszego użytkownika |
» 2016-04-13 17:10:45 Ok. I tak już napisałem mini-interpreter, bez tego błędu. Zamykam temat. |
|
« 1 » |