Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 03.10.2004, 18:25 Titel: Fehlerhafter umgang mit Speicher |
|
|
Hi!
Ich bin gerade dabei eine Stringklasse (für Zeichenliterale) zu schreiben. Der String wird dabei in einem dynamischen "char" Feld gespeichert. Irgendwie gehe ich aber bei der gesamten Geschichte (bis auf die Konstruktor/Destruktor Sache) mit dem Speicher falsch um. Ständig kommen bei der Ausführung des Testprogramms irgendwelche Fehler, die auf beschädigte Speicherblöcke oder so hinweisen. Hier mal mein Code am Beispiel der + und += Operatoren:
Code: |
UGDString UGDString::operator +( UGDString s )
{
char* l_Temp = new char[ strlen( m_sString ) + strlen(s.GetData()) + 1 ];
strcpy( l_Temp, m_sString );
strcat( l_Temp, s.GetData() );
UGDString l_String = UGDString( l_Temp );
delete [] l_Temp;
return l_String;
}
|
Hier kommt seit ich "strcpy" und "strcat" anstelle von "sprintf" verwende kein Fehler mehr. Dafür aber hier:
Code: |
UGDString& UGDString::operator +=( UGDString s )
{
(*this) = (*this) + s;
// return result:
return (*this);
}
|
Achso, hier noch der = Operator:
Code: |
UGDString& UGDString::operator =( UGDString s )
{
if( m_sString )
{ // if there is data in the string:
// delete it:
free( m_sString );
}
// allocate enough memory:
m_sString = new char[ strlen( s.GetData() ) + 1 ];
// copy string:
strcpy( m_sString, s.GetData() );
// return result:
return (*this);
}
|
Ich denke ich hab hier irgendetwas mit der Speicherzuweisung komplett falsch gemacht, aber ich komm einfach nicht drauf könnte auch sein dass es daran liegt, dass der Code in einer DLL implementiert wurde, aber ich denke eher nicht...
Ich bin hier auf eure Hilfe angewiesen. |
|
Nach oben |
|
 |
DarK Super JLI'ler

Anmeldedatum: 23.07.2002 Beiträge: 452 Wohnort: NRW Medaillen: Keine
|
Verfasst am: 03.10.2004, 19:04 Titel: |
|
|
wir nehmen genau das gerade in der Schule durch, bei der ganzen geschichte passiert folgendes, wenn du eine Klasse "kopierst"
also in eine Unterfunktion neu aurufst indem du sie als parameter
deklarierst, kopiert er alle Variabel der Klasse..
int = int
aber da ein char ein zeiger ist kann er den nicht ohne weiteres kopieren...
somit must du einen sogenannten "copy konstruktur" machen ...
Code: | UGDString::UGDString(UGDString ©)
{
m_sString = new char[strlen(copy.m_sString)+1];
strcpy(m_sString, copy.m_sString);
//u.s.w. z.b.:
x = copy.x;
} |
und schon ist dein Problem gelöst...
ansonsten hab ich keine Fehler entdecken können _________________ "Denken ist Arbeit, Arbeit ist Energie und Energie soll man sparen."
"Theorie ist, wenn man alles weiss, aber nichts funktioniert.
Praxis ist, wenn man nichts weiss, aber alles funktioniert.
Realität ist, wenn nichts funktioniert und keiner weiss warum."
"Es gehört ein wenig Mut dazu nicht das zu tun was ALLE tun" |
|
Nach oben |
|
 |
C++Builder Senior JLI'ler

Anmeldedatum: 04.10.2003 Beiträge: 235
Medaillen: Keine
|
Verfasst am: 03.10.2004, 19:25 Titel: |
|
|
DarK hat Folgendes geschrieben: | aber da ein char ein zeiger ist |
char = char genau wie int = int
char* != char  |
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.10.2004, 15:50 Titel: |
|
|
Danke, so klappt es. Hab ich doch tatsächlich den Copy-Konstruktor vergessen... naja, jetzt klappt es und ich kann weitermachen, vielen Dank! |
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.10.2004, 16:10 Titel: |
|
|
Noch ein Problem, das diese Klasse betrifft, ich komm da einfach nicht drauf.
Ich will aus einem String ein Stück herrausschneiden und hab folgende Daten gegeben:
Code: |
char* String; // Ist der Anfangsstring
char* SubStart; // Zeiger auf die Startposition des Substrings in "String"
int SubLength; // die Länge des Substrings
char* NewString; // das Ergebniss (String ohne den Substring)
|
|
|
Nach oben |
|
 |
Hazel JLI MVP


Alter: 40 Anmeldedatum: 19.07.2002 Beiträge: 1761
Medaillen: Keine
|
Verfasst am: 05.10.2004, 16:30 Titel: |
|
|
Code: |
char* String; // Ist der Anfangsstring
char* SubStart; // Zeiger auf die Startposition des Substrings in "String"
int SubLength; // die Länge des Substrings
char* NewString; // das Ergebniss (String ohne den Substring)
SubStart = &String[where];
NewString = new char[SubLength+1];
for(int i = 0; i < SubLength; ++i)
{
NewString[i] = SubStart[i];
}
NewString[i] = '\0';
|
Keine Ahnung ob es in der Standard C Lib eine Copy Funktion gibt, bei der man eine Position und eine Länge angeben kann... _________________ *click* Dabuu!?
Twitter: http://twitter.com/Ollie_R
|
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.10.2004, 17:53 Titel: |
|
|
Ich glaub ich hab mein Problem falsch erklärt. Ich meinte eigentlich folgendes:
Vorher:
String: "Das ist ein schöner String."
SubString: "schöner "
Nachher:
String: "Das ist ein String."
Den Substring kenn ich. Dessen Startposition im String bekomm ich dann über "strstr()" raus. Seine Länge natürlich über "strlen()" nur wie ich damit dann weitermach weis ich nicht. |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 05.10.2004, 18:17 Titel: |
|
|
Code: | strcpy(neuerString,alterString);
for(int i=0; i<strlen(neuerString)-strlen(substring); i++)
neuerstring[i]=alterstring[i+strlen(substring)]; |
Würde ich mal spontan sagen. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
VerruecktesHuhn Super JLI'ler

Anmeldedatum: 30.07.2002 Beiträge: 492 Wohnort: Stuttgart Medaillen: Keine
|
Verfasst am: 05.10.2004, 18:43 Titel: |
|
|
Dank deinem Post ist mir jetzt eingefallen, wie man es machen könnte:
Code: |
char String[] = "Das ist ein schöner String.";
char SubString[] = "schöner ";
int l_SubLength = SubString;
char* l_SubPos = NULL;
char* l_Final = new char[ strlen( String ) ];
strcpy( l_Final, String );
l_SubPos = strstr( l_Final, SubString );
strcpy( l_SubPos, (l_SubPos+l_SubLength) );
// l_Final == "Das ist ein String."
delete [] l_Final;
|
Der Code funktioniert wunderbar, bis auf das ich bei "delete [] l_Final;" eine Laufzeitfehlermeldung bekomme, die besagt "Damage after normal block" (oso). Wenn ich das aber ignoriere gehts perfekt weiter
@Fallen:
Du kopierst einfach den gesamten alten String (ab Position strlen(SubString)) in deinen NeuenString? |
|
Nach oben |
|
 |
Fallen JLI MVP


Alter: 41 Anmeldedatum: 08.03.2003 Beiträge: 2860 Wohnort: Münster Medaillen: 1 (mehr...)
|
Verfasst am: 05.10.2004, 18:50 Titel: |
|
|
VerruecktesHuhn hat Folgendes geschrieben: | @Fallen:
Du kopierst einfach den gesamten alten String (ab Position strlen(SubString)) in deinen NeuenString? |
Ich kopiere den gesammten String, ja aber von anfang an, danach springe ich zu der stelle wo substring beginnt und kopiere an diese position alle zeichen die nach (position von substring)+(länge von substring) kommen, kann aber gut möglich sein das ich dadurch etwas fremdspeicher mitkopiere, also mal schaun obs auch geht wenn man da strlen(...)-i hinschreibt. _________________ "I have a Core2Quad at 3.2GHz, 4GB of RAM at 1066 and an Nvidia 8800 GTS 512 on Vista64 and this game runs like ass whereas everything else I own runs like melted butter over a smokin' hot 18 year old catholic schoolgirl's arse." |
|
Nach oben |
|
 |
|