Problem mit Pointern?

OP #1944932
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?
Gast #1944944
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren