www.mikrocontroller.net

Forum: PC-Programmierung Problem mit Pointern?


Autor: Krisi K. (haxi)
Datum:

Bewertung
0 lesenswert
nicht 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:
class Klasse {
  protected:
    char * name;
    ...
  public:
    void SetName(....
}

...

class eineandere {
  public:
    Klasse * Klassen;
    
      ...
        Klassen = new Klasse;
        if ... {
          Klasse[count].SetName("was");
          printf("%s", Klasse[count].GetName()); // "was"
        }
      ...
    printf("%s", Klasse[count].GetName()); // "��0"
}
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?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.