Ich habe eine statische Variable in einer Funktion Template-Klasse wie folgt aus:statische Variable in Funktion Template-Klasse durch die globale statische Variable überschrieben
template<class T>
struct builder
{
static T* buildOrGet()
{
static T* built = nullptr;
if(built == nullptr) built = new T;
return built;
}
};
und an anderer Stelle im Code eine globale Variable mit einem Konstruktor.
static SomeClass global_var;
Zuerst wusste ich nicht, was passiert ist, aber das built
Variable wurde ohne Grund an einem bestimmten Punkt des Programms beschädigt. Dann fügte ich einen 4-Byte-Datenhaltepunkt in Visual Studio auf &built
hinzu, um zu sehen, wer seinen Speicher nach built = new T;
zertrümmerte, und tatsächlich ist es während des C++ - Initialisierers beim Initialisieren von Elementen von global_var
im SomeClass
-Konstruktor. Der Code ist in einer DLL, automatisch geladen von einer exe abhängig davon. Es ist wie global_var
Speicherüberschneidungen built
Speicher, der sehr seltsam ist.
Ich verstehe wirklich nicht warum und wie das außer einem Fehler in Visual Studio 2015 passieren kann, können Sie mir helfen?
Können Sie mehr Details, insbesondere über SomeClass geben? Gibt es insbesondere eine Möglichkeit, dass ein illegaler Schreibvorgang in seinem Konstruktor passiert? – Eternal
in der Tat 'SomeClass' hat einige Daten Mitglieder, und wenn der Daten Breakpoint ausgelöst wurde sah ich die Adresse seiner Mitglieder für die aktuelle Instanz und einer von ihnen war die Adresse von' Built' + 1, bedeutet der Speicher von der 'besetzt global_var' überlappt den eingebauten Speicher. Und Mitglieder werden nur initialisiert, sie überschreiben keinen Speicher (in der Assembly entspricht der Code, an dem der Breakpoint ausgelöst wird, der Initialisierung des Members: etwas wie: move rcx this mov rcx + 28h 0 <- Datenhaltepunkt wird hier ausgelöst – Juicebox
I Wetten, was Sie hier beschreiben, ist eigentlich kein Problem selbst, sondern eine Konsequenz einer Speicherbeschädigung (die irgendwo zuvor passiert). –