Problem z implementacją stringa
Ostatnio zmodyfikowano 2012-06-18 15:52
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: class String { char * str; int sz; void reserve( const char * to_str ); 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 ]; } }
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? |
|
szyx_yankez |
» 2012-06-18 15:36:43 Być może próbujesz blok pamięci który nie został przydzielony do tej zmiennej... |
|
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: 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! |
|
« 1 » |