Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit delete[]

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
25.10.2005, 18:04 Uhr
Gap



Hallo,

Mein Programm stürzt immer bei delete[] ab, wenn ich davor einem Element aus der zu löschenden Liste einen Wert zuweiß.

Mein Code:


C++:
class Test
{
private:
  char *m_data;
public:
  Test() : m_data(0) { ; }
  void set_str( const char *str )
  {
   m_data = new char[strlen(str)];
   for( int i = 0; i < strlen(str); i++ )
    m_data[i] = str[i];
   m_data[i] = '0'; /* <- <- <- Wenn ich das weglass gehts <- <- <-*/
  }
  ~Test()
  {
   if( m_data )
    delete []m_data;
  }
}



Woran kann das liegen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
25.10.2005, 18:14 Uhr
ao

(Operator)



C++:
   m_data = new char[strlen(str) + 1]; // Ein Byte mehr reservieren für das Terminator-Zeichen!


Und warum so umständlich (erst allozieren, dann zeichenweise (!) kopieren), mach doch einfach m_data = strdup (str); und fertig.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
25.10.2005, 18:15 Uhr
ao

(Operator)



C++:
   m_data = new char[strlen(str) + 1]; // Ein Byte mehr reservieren für das Terminator-Zeichen!



Ach so, die String-Terminierung geht mit

C++:
m_data[i] = 0; // nicht '0'



Und warum so umständlich (erst allozieren, dann zeichenweise (!) kopieren), mach doch einfach

C++:
m_data = strdup (str);

und fertig.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
25.10.2005, 18:36 Uhr
virtual
Sexiest Bit alive
(Operator)


Angenommen Dein String hat 8 Zeichen, dann belegst Du in m_data auch 8 Bytes. nach verlassen der for schleife ist i==8. Damit greifst Du also auf ein nicht mehr existentes Byte zu. Richtig wäre es, ein Byte mehr Speicher zu belegen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
25.10.2005, 18:46 Uhr
Gap




C++:
    
m_data = new char[strlen(str) + 1]; // Ein Byte mehr reservieren für das Terminator-Zeichen!



Das hilft auch nichts
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
25.10.2005, 18:54 Uhr
Gap



Ah, Ich idiot!

Es lag schon an dem Fehler:


C++:
m_data = new char[strlen(str) + 1];



Nur ich hab ihn in zwei Funktionen gehabt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
25.10.2005, 19:55 Uhr
~Harry Hirsch
Gast


m_data = new char[strlen(str)];

-> Speicherloch. Es wird nicht kontrolliert, ob vorher schon Speicher alloziiert war.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
25.10.2005, 20:16 Uhr
(un)wissender
Niveauwart


Na ja, ist nicht zwangsläufig eines, aber es ist schon ein guter Kandidat.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: