Forum: PC-Programmierung Problem mit Pointern?


von Krisi K. (haxi)


Lesenswert?

Ich hab folgendes Problem:
Ich hab eine Klasse mit der variable "char * name;"
Der Name lässt sich mit einer Klassen internen Funktion setzen.

Jetzt soll die Klasse in einem dynamischen Array mit "Klasse * Klassen;" 
verwendet werden.
Wird der Name aber jetzt in einer if anweisung einer Funktion in einer 
anderen Klasse gesetzt und auch da abgefragt kriegt man den Namen 
zurück.
Außerhalb davon kommt aber nur ein 3 Zeichen großer, falscher String 
z.B. "��0" raus.

Das ganze sieht gekürzt in etwa so aus:
1
class Klasse {
2
  protected:
3
    char * name;
4
    ...
5
  public:
6
    void SetName(....
7
}
8
9
...
10
11
class eineandere {
12
  public:
13
    Klasse * Klassen;
14
    
15
      ...
16
        Klassen = new Klasse;
17
        if ... {
18
          Klasse[count].SetName("was");
19
          printf("%s", Klasse[count].GetName()); // "was"
20
        }
21
      ...
22
    printf("%s", Klasse[count].GetName()); // "��0"
23
}
Woran liegt das?


Und noch was:
Schon nach zwei Klassen die gefüllt werden gibts Probleme z.B. MemLeaks 
und "Segmention Fault" und wie muss ich new oder malloc verwenden damit 
das nicht passiert?

von Sebastian (Gast)


Lesenswert?

Krisi K. schrieb:
> Woran liegt das?

Mit "new Klasse" wird nur genau ein Objekt erzeugt. D.h. Klasse[0] (was 
identisch zu *Klasse ist) funktioniert, aber bereits Klasse[1] zeigt auf 
nicht initialisierten Speicherbereich.

Du möchtest vermutlich "new Klasse[anzahl]" verwenden, wobei die Anzahl 
der zu erzeugenden Objekte bekannt sein muss.

Vorsicht: Mit "new x[c]" erzeugte Mengen von Objekten dürfen nicht mit 
"delete", sondern nur mit "delete[]" wieder gelöscht werden, also z.B. 
"Klassen = new Klasse[9]; /* ... */ delete[] Klassen;".

Grundsätzlich, d.h. wann immer es geht, sollte in C++ (worum es hier 
doch geht, oder?) Gebrauch von der Standardbibliothek gemacht werden, da 
man sich so die ganzen Pointer-Geschichten sparen kann; d.h. z.B. 
"std::vector<Klasse> Klassen(anzahl); /* ... */".

Der Vorteil ist (a) dass man nicht vergessen kann, Speicher wieder 
freizugeben und (b) dass es weniger einfach ist, auf nicht 
initialisierten Speicher zuzugreifen. Beides könnte zu schwer 
nachvollziehbaren und u.U. kaum zu reproduzierenden Fehlern führen.

von Rolf Magnus (Gast)


Lesenswert?

Und für den Namen std::string verwenden statt "roher" Zeiger auf char.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.