Robert B.: C++: char* behält zugewiesenen wert und std::string nimmt default an... wieso?

Beitrag lesen

Hallo @hmm,

class Bla
{
  public:
    static std::string a;
    static std::char* b;
    ~Bla()
    {
      printf(a);
      printf(b);
    }
} Bla;
  • std::char brauchst du nicht, char reicht. (War mir neu, dass das überhaupt funktioniert.)
  • Was macht denn das Bla nach dem Ende der Klassendefinition?
  • Welchen Zweck hat die Klasse, wenn es keine sinnvollen Objekte davon gibt? Deine static-Attribute sind Klassenattribute, keine Klassenattribute.
  • Du verwendest printf in einer unsicheren Variante: Sobald a oder b einen Formatstring enthalten, greifst du auf undefinierten Speicher zu. Nimm lieber cout oder puts.
  • Warum definiert die Klasse als einzige Methode den Destruktor?
std::string Bla::a = "";
std::char* Bla::b = "";

irgendEinKlasse::FunktionDieAufgerufenWird()
{
  Bla::a = "test";
  Bla::b = "test";
}

wenn ich das mache so ist im Destruktor ~Bla a="" und b="test".

woran liegt das?

Ich vermute, dass von a der Destruktor aufgerufen wird. b ist als Pointer auf einen char definiert, also „herkömmliches C“, da funktioniert die Speicherverwaltung anders.

Mein Ziel wäre es, später in irgendEinKlasse::FunktionDieAufgerufenWird() anstelle eine std::string ein eigenes kompliziertes datenobjekt zu setzen und dass dann im destruktor abzufragen... aber dafür muss ich erstmal verstehen wie ich machen kann das std::string a seinen wert behält.

Dann schau dir mal, wie ein Objekt mit seinen Attributen „zerstört“ wird, sprich in welcher Reihenfolge die Destruktoren aufgerufen werden.

Ein std::string ist übrigens auch ein „kompliziertes Datenobjekt“ ;)

Viele Grüße
Robert