Statische variable nicht initialisiert
Ich habe ein seltsames problem mit einer statischen variable, die offensichtlich nicht initialisiert ist, wie es sein sollte.
Ich habe ein riesiges Projekt, das läuft mit Windows und Linux. Da die Linux-Entwickler dieses problem nicht hat, würde ich vorschlagen, dass diese Art von WLAN-Visual-Studio-Zeug.
Header-Datei
class MyClass
{
//some other stuff here
...
private:
static AnotherClass* const Default_;
};
CPP-Datei
AnotherClass* const MyClass::Default_(new AnotherClass(""));
MyClass(AnotherClass* const var)
{
assert(Default_);
...
}
Problem ist, dass Default_
ist immer NULL
. Ich habe auch versucht, einen Haltepunkt bei der Initialisierung der Variablen, aber ich kann es nicht fassen.
Gibt es ein ähnliches problem in einer anderen Klasse.
CPP-Datei
std::string const MyClass::MyString_ ("someText");
MyClass::MyClass()
{
assert(MyString_ != "");
...
}
In diesem Fall MyString_
ist immer leer. Damit nicht wieder initialisiert.
Hat jemand eine Idee dazu? Dies ist ein Visual Studio-Einstellungen problem?
Cheers Simon
Edit:
Stieß ich auch auf die statische Initialisierung Fiasko. Aber ich bin mir nicht sicher, ob das könnte das problem sein, da gibt es keine Probleme mit dem Linux-compiler. Sollte das nicht der compiler in der gleichen Weise reagieren in diesem Fall?
- Versuchen Sie, erstellen ein neues Projekt von Grund auf und sehen, wenn es passiert, gibt es auch
- Sorry, kann das nicht tun. Als ich sagte, dass es ein wirklich riesiges Projekt.
- Ich nehme an, das erste Beispiel war ein Tippfehler und sollte
AnotherClass* const MyClass::Default_(new AnotherClass(""));
- Man könnte noch versuchen, indem Sie ein neues, leeres test-Projekt mit einer statischen member und sehen, ob es richtig initialisiert wird, aber...
- Ist dieser code in einer DLL?
- Keine DLL - @Ashley: Ok, ich habe eine neue Projekt ähnlich wie das Amt des sbi und es funktioniert auch!?
- Ist der code in einer statischen Bibliothek? Anschließend führen Sie in Probleme, wenn die Klasse MyClass (gerade die compilation unit) wird nicht verwiesen wird, indem Sie das hing Programm. Der linker wird dann nicht das erstellen von statischen Initialisierungs-code für die variable.
- Es ist eine statische Bibliothek...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich schlage vor, Sie verwenden statischen member-Funktion static-variable und nicht die variable selbst:
Der standard garantiert, dass p einmal initialisiert, wenn die Funktion das erste mal aufgerufen, so erhalten Sie immer richtig initialisiert Objekt (es sei denn, Sie haben bereits erschöpft, Speicher-oder Sie-Konstruktor warf).
Bitte beachten Sie, dass dies möglicherweise oder möglicherweise nicht thread-sicher (hängt von Ihrem compiler wirklich).
Ist und noch ein Hinweis - jetzt haben Sie, um zu Leben mit "memory leak" wie ist es wirklich unmöglich, zu entscheiden, wenn um das Objekt zu zerstören und Sie haben KEINE MÖGLICHKEIT zum zurücksetzen von p auf NULL.
* const
das semantische äquivalent zu&
einmal haben Sie entfernt die NULL-Möglichkeit ?Go
hier...) aber es sollte reserviert werden, denke ich, auf Besondere Situationen (große Objekte) und verschoben, bis notwendig.In diesem Fall während der Initialisierung einige andere statische Variablen, die Sie möglicherweise sehen werden, sind die statische Initialisierung Fiasko.
Nicht. Wie ich es verstehe, ist die Initialisierung in der Reihenfolge der individuellen Zusammenstellung Einheiten nicht definiert. Also die Linux-Entwickler einfach nur Glück. Heute. Morgen, wer weiß?
Funktioniert Auf Meiner Maschine(TM):
Ich nehme an, das problem ist, dass
MyClass::MyClass()
nennt als eine weitere statische variable Konstruktor. Die Initialisierung von statischen Variablen, die nicht immer auftreten, in der Reihenfolge, die Sie möchten, dass es.MyClass::
so dass es wahrscheinlich nur ein Schreibfehler in der Frage.