Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Error in `./osoba': munmap_chunk(): invalid pointer: 0x08048e52 *** Przerwane

Ostatnio zmodyfikowano 2016-04-13 17:10
Autor Wiadomość
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]

C/C++
#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"; // GDZIEŚ W TEJ OKOLICY JEST BŁĄD.
    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";
}
P-145056
pekfos
» 2016-02-19 21:10:13
C/C++
if( strcmp( _imie, "" ) )
{
    realloc( imie, sizeof( _imie ) + 1 );
    this->imie = _imie;
}
Ten kod nie ma żadnego sensu.
P-145057
Pawlo3
Temat założony przez niniejszego użytkownika
» 2016-02-20 15:56:00
Czemu?
P-145080
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.
P-145086
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.
P-145089
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.
P-147227
« 1 »
  Strona 1 z 1