Fragen zur Speicherverwaltung von static-class-members
-
Hallo, ich habe drei kurze Fragen:
1. Sind static-class-members stilistisch schön oder gibt es bessere Alternativen?
Mein Problem: Eine Klasse hat etliche Variablen. Da ich (leider) mit MFC arbeite, muß
ich mehrere Instanzen der Klasse erstellen, die Werte der Variablen sollen aber für jede
Instanz dieselben sein. Also deklariere ich sie als static, damit der Konstruktor sie nicht
überschreibt. Insgesamt finde ich diese Methode nicht so elegant, aber
mir ist bis jetzt keine bessere Lösung eingefallen. Fällt euch da was ein, oder
ist das so in Ordnung?2. In einer Klasse wird im Konstruktor ein zweidimensionales Array dynamisch erstellt(mit new).
In einer anderen Memberfunktion foo() wird das Array neu erstellt, da sich die Größen ändern. Jetzt habe
ich also zweimal mit new das Array erstellt. Ich lösche das Array im Destruktor(mit delete[] und einer Schleife).
Reicht das aus oder muß ich für jeden Aufruf von foo() einen eigenen "Destruktor" basteln?3. In einer weiteren Klasse wird im Konstruktor auch ein Array dynamisch erstellt. Dieses Array ist auch static,
da ich es für jede Instanz brauche. Im Destruktor wird das Array gelöscht. Jetzt meine Frage:
Werden alle Konstruktor/Destruktor-Aufrufe bis auf den ersten und letzten im Quellcode ignoriert, wenn
Array static ist?
Ich kann nämlich weiterhin auf das Array zugreifen, obwohl schon einige Male der Destruktor der Klasse aufgerufen wurde...Dankeschön schon mal im voraus
Viele Grüße
E-the-Real
-
1. Eventuell könntest du eine andere Klasse mit den Variablen erstellen als Singleton. Weiß aber nicht ob das wirklich schöner ist...
2. Du musst bei jedem Aufruf von foo das Array löschen! Am besten wäre es aber wenn du einen 2-dimensionalen std::vector nimmst, dann brauchst du dich um sowas nicht zu kümmern!
3. Hab ich keine Ahnung, würde aber nicht sagen dass sie einfach ignoriert werden!
-
klingt nach nem Design Problem.
Singleton kann helfen, so lassen würde ich es aber sicher nicht.std::vector und gut ist
nix wird ignoriert. es werden alle dtors aufgerufen nur nicht der dtor der static variable.
-
Shade Of Mine schrieb:
es werden alle dtors aufgerufen nur nicht der dtor der static variable.
Wann wird der denn dann aufgerufen? Logischerweise beim Programmende, aber wie sieht es mit der Reihenfolge aus im Bezug auf globale Variablen, bzw. andere static Variablen? Gibts da eine Regel?
-
Thx für die Antworten.
@Shade:Das mit dem Design-Prblem trifft leider zu und ich kann MFC auch irgendwie nicht leiden.
Ich habe mich etwas über Singleton-Klassen informiert und irgendwie ist da meine Klasse schon fast ein Singleton-Muster. Also, ich denke, ich werde vorerst die static-Lösung beibehalten.
Der Funktion foo habe ich einfach den Destruktor vorangestellt, so gibt's keine Speicherlacks...
Gruß
E-the-Real