Ich habe an einer gemeinsamen Zeiger-Implementierung (Handle) für die Spiel-Engine meines Studentenprojekts gearbeitet, und wir stießen auf einen Fehler, den wir nicht erklären konnten. Aus irgendeinem Grund wurde zu einem bestimmten Zeitpunkt in unserer Fabrik ein ungültiger interner Zeiger über ein Handle an eine Fabrik weitergegeben, was während unseres Archetyp-Ladens einen Absturz verursachte. Wir debuggten stundenlang durch den Prozess und lösten komplexe Anweisungen für eine einfachere Fehlerbehebung auf ihre einfachsten Versionen herunter. Ich habe das Problem schließlich auf den Kopierkonstruktor der Handle-Klasse beschränkt. Es schien jedoch immer noch so, als gäbe es einen Zwischenschritt, bei dem der interne Zeiger freigegeben wurde. Ich las jeden Artikel, den ich finden konnte, was dieses Problem verursachen könnte, und fand nichts. Schließlich entschied ich mich, die Demontage zu betrachten und zu sehen, ob ich herausfinden konnte, was vor sich ging. Hier ist der Kopierkonstruktor ohne die Disassemblierung.
%Vor%Dies ist der Kopierkonstruktor mit der Disassemblierung.
%Vor%Das Problem (soweit ich das beurteilen kann) ist hier:
%Vor%Wie wir alle wissen, wird dies verwendet, um Speicher schnell zu löschen. Diese Anweisung löscht jedoch den Zeiger, auf den der Zeiger des internen Hands-to-Pointer von rs Hands verweist, und nicht nur das, sondern verletzt const, da das übergebene Handle ein const-Verweis ist. Ich bin mir nicht sicher, ob es ein VS-Problem ist, eine Art Flag, das in unseren Build-Einstellungen gesetzt ist, verursacht es, aber der Kopierkonstruktor funktioniert gut, bis wir versuchen, Archetypen damit zu machen.
Jede Hilfe würde sehr geschätzt werden!
EDIT 1: Ich habe das Problem weiter erforscht, nachdem einige der Kommentare ans Licht kamen, dass ich irgendwo in meinem Code eine temporäre Variable zurückgeben könnte. Ich konnte nichts finden, was darauf hinwies, dass ich das tat, aber ich habe noch mehr Disassemblierungen durchforstet, um nach Hinweisen zu suchen. Hier ist unsere CreateGenericArchetype-Funktion, wo das Problem auftritt.
%Vor%Die Linie, die all unsere Probleme (im Moment) verursacht, ist diese:
%Vor%Natürlich habe ich mein Debugging auch auf CreateArchetypeComponent ausgedehnt, also auch hier:
%Vor%Das Objekt erbt von Component, daher ist die statische Abwärtswandlung des Objekts in Component gültig, und der Konstruktor konstruiert das Handle erfolgreich aus der Komponente *. Das Problem tritt auf, wenn wir versuchen, das Handle, das wir in der Funktion erstellt haben, zurückzugeben. Hier ist die Demontage dieser Interaktion:
%Vor%******* zurück zu CreateGenericArchetype *******
%Vor%******* Kopieren Konstruktor Demontage von oben hier *******
%Vor%Wenn mein Kopierkonstruktor nicht mit der "created_component" aufgerufen wird, weil rhs Handle eine lokale Variable zurückgibt, kann ich nicht sehen, wo es möglicherweise schief geht, es sei denn, kommt zurück Handle von CreateArchetypeComponent befindet sich auf dem Stapel, wenn es an den Kopierkonstruktor übergeben wird und dann gelöscht wird.
Danke für die großartige Hilfe bei diesem Problem, aber wir haben herausgefunden, was vor sich geht. In einigen Handle-Konstruktoren mussten wir Speicher für den Zeiger reservieren, auf den der interne Zeiger des Handle verweisen sollte. Was geschah, war, dass der Handle selbst einen Zeiger verwendete, der auf dem Stapel gehalten wurde, und wenn der Befehlscode rep stos
aufgerufen wurde, löschte er den Zeiger.
Tags und Links c++ x86 visual-studio-2013 shared-ptr