JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=2529508ac7f9c2df6d425898f7e4254eMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

Fehlerhafter umgang mit Speicher

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 03.10.2004, 18:25    Titel: Fehlerhafter umgang mit Speicher Antworten mit Zitat

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 Sad 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
DarK
Super JLI'ler



Anmeldedatum: 23.07.2002
Beiträge: 452
Wohnort: NRW
Medaillen: Keine

BeitragVerfasst am: 03.10.2004, 19:04    Titel: Antworten mit Zitat

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 &copy)
{
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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
C++Builder
Senior JLI'ler



Anmeldedatum: 04.10.2003
Beiträge: 235

Medaillen: Keine

BeitragVerfasst am: 03.10.2004, 19:25    Titel: Antworten mit Zitat

DarK hat Folgendes geschrieben:
aber da ein char ein zeiger ist

Question

char = char genau wie int = int

char* != char Wink
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.10.2004, 15:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.10.2004, 16:10    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Hazel
JLI MVP
JLI MVP


Alter: 40
Anmeldedatum: 19.07.2002
Beiträge: 1761

Medaillen: Keine

BeitragVerfasst am: 05.10.2004, 16:30    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.10.2004, 17:53    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 05.10.2004, 18:17    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
VerruecktesHuhn
Super JLI'ler



Anmeldedatum: 30.07.2002
Beiträge: 492
Wohnort: Stuttgart
Medaillen: Keine

BeitragVerfasst am: 05.10.2004, 18:43    Titel: Antworten mit Zitat

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 Smile

@Fallen:
Du kopierst einfach den gesamten alten String (ab Position strlen(SubString)) in deinen NeuenString?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Fallen
JLI MVP
JLI MVP


Alter: 41
Anmeldedatum: 08.03.2003
Beiträge: 2860
Wohnort: Münster
Medaillen: 1 (mehr...)

BeitragVerfasst am: 05.10.2004, 18:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> Entwicklung Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum