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

Problem z implementacją stringa

Ostatnio zmodyfikowano 2012-06-18 15:52
Autor Wiadomość
kubawal
Temat założony przez niniejszego użytkownika
Problem z implementacją stringa
» 2012-06-18 15:29:41
Witam!
Ostatnio z nudów napisałem sobie swoją implementacje typu string z biblioteki standardowej
Mój kod wygląda tak:
C/C++
class String
{
    char * str;
    int sz;
    void reserve( const char * to_str ); // inicjuje łańcuch nową wartością
public:
    String() { reserve( "" ); }
    String( char * sstr ) { reserve( sstr ); }
   
    ~String() { delete[] str; }
   
    size_t size() { return sz; }
    const char * c_str() { return str; }
   
    char * operator =( char * to_str ) { reserve( to_str );
        return to_str; }
   
    friend istream & operator >>( istream & is, String & s );
    friend ostream & operator <<( ostream & os, String & s );
   
    char operator []( int size ) { if( size > sz ) throw out_of_range( "Za duży licznik" );
       
        return str[ size ]; }
};

void String::reserve( const char * to_str )
{
    delete[] str;
    str = new char[ strlen( to_str ) ];
    sz = strlen( to_str );
    for( int i = 0; i < sz; i++ )
    {
        str[ i ] = to_str[ i ]; //kopiowanie
    }
}

istream & operator >>( istream & is, String & s )
{
    for( int i = 0; i < s.sz; i++ )
         is >> s.str[ i ];
   
    return is;
}

ostream & operator <<( ostream & os, String & s )
{
    for( int i = 0; i < s.sz; i++ )
         os << s.str[ i ];
   
    return os;
}

Problem jest taki, że komputerowi nie podoba się
użycie operatora delete[]. Wywala runtime_error, Visual wywala "unhandled exception..." itd.
Co jest nie tak?
P-58629
szyx_yankez
» 2012-06-18 15:36:43
Być może próbujesz blok pamięci który nie został przydzielony do tej zmiennej...
P-58630
kubawal
Temat założony przez niniejszego użytkownika
» 2012-06-18 15:52:02
faktycznie, w funkcji reserve() nie biorę pod uwagę przypadku, gdy łańcuch jest
inicjowany poraz pierwszy. Powinno być tak:
C/C++
class String
{
    char * str;
    int size;
    bool is_init;
    //...
    String()
        : is_init( false )
    { /*...*/ }
    String( char * sstr )
        : is_init( false )
    { /*...*/ }
    //...
};

void String::reserve( char * to_str )
{
    if( is_init ) delete[] str;
    else is_init = true;
    //...
}
//...

Dzięki!
P-58633
« 1 »
  Strona 1 z 1