Hallo
nachdem ich das Kapitel 8.4, Singletons, in "C++ für Spieleprogrammierer" durchgearbeitet hatte, habe ich mir mal auf
Gameprogrammingpatterns deren Implementierung angesehen und habe danach den folgenden Code erstellt:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
class singleton
{
public:
static singleton& instance()
{
static singleton *instance = new singleton;
cout << "Adresse von Zeiger instance = " << &instance << endl;
cout << "Adresse der Instanz = " << instance << endl;
return *instance;
}
void textausgabe()
{
cout << "Hat funktioniert!" << endl;
}
private:
int zahl;
singleton()
{
cout << "Konstruktor von Singleton aufgerufen." << endl;
}
};
int main()
{
singleton &referenz = singleton::instance();
singleton &zweite_referenz = singleton::instance();
referenz.textausgabe();
}
|
Der Code ist nur als Test gedacht und verfolgt nur einen Zweck: Ich versuche(!) zwei Instanzen des Singletons zu erstellen und lasse mir die Speicheradressen ausgeben, um anzuzeigen, ob es funktioniert oder nicht.
Inzwischen habe ich herausgefunden, wie dieser Singleton funktioniert, doch was mir dabei auffiel ist, dass die Adresse des Zeigers
*instance bei jeder erneuten Ausführung des kompilierten Programmes gleich bleibt.
Hier mal die relevante Ausgabe:
$ ./Programme/c++/singleton
Konstruktor von Singleton aufgerufen.
Adresse von Zeiger instance = 0x6021b8
...
$ ./Programme/c++/singleton
Konstruktor von Singleton aufgerufen.
Adresse von Zeiger instance = 0x6021b8
...
Ich kann nur vermuten, dass der statische lokale Zeiger über die Laufzeit des Programmes hinaus erhalten bleibt. Aber warum? Hängt das vielleicht damit zusammen, wie Linux seinen Speicher verwaltet? Oder interpretiere ich die Ausgabe falsch?
Die Adresse, auf die der Zeiger deutet, variiert im übrigen, so wie ich es erwartet hätte.
Kurz zu meiner Umgebung:
Betriebssystem: Arch Linux mit KDE
Compiler: gcc (g++)
Offtopic:
Das ist das erste Mal, dass mich ein Forum meinen Beitrag nicht posten lässt wegen eines Rechtschreibfehlers