Frage

Ich erhalte die folgende Ausnahme, wenn ich meine Anwendung in Release-Modus von Visual C ++ ausgeführt werden.

  

Unbehandelte Ausnahme:   System.AccessViolationException:   Versuchte geschützt zu lesen oder schreiben   Erinnerung. Dies ist häufig ein Hinweis   dass andere Speicher beschädigt. beim   _cexit () bei .LanguageSupport._UninitializeDefaultDomain (Void   * Cookie) bei .LanguageSupport.UninitializeDefaultDomain ()   beim   .LanguageSupport.DomainUnload (Object   Quelle, Eve ntArgs Argumente) an   .ModuleUninitializer.SingletonDomainUnload (Objec   t Quelle, EventArgs Argumente)

Dies geschieht nicht in Debug-Modus. Am Anfang sah ich diese Ausnahme auf meinem Computer zu Hause, aber nicht Computer arbeiten. Wenn ich auf meinem Computer weiter zu entwickeln, landete ich in sie stoßen auf.

Auch fand ich, dass, wenn ich drei const hinzugefügt std :: string Variablen die Ausnahme ausgelöst wurde. Wenn ich dann entfernte alle dann ging gut.

Ein weiteres Stück Information: Ich habe, dass all Compiler-Optimierungen in Release-Modus ausgeschaltet findet die Ausnahme gehen macht entfernt

etwas faul vor sich geht. Alle Ideen, wie diese auf der Spur?

Danke für die Hilfe, Joe

War es hilfreich?

Lösung

Joe, haben Sie eine Speicherleck .

Du bist wahrscheinlich versuchen, einige Speicher zu verwenden, die gelöscht wurde.

Siehe dieser Artikel für häufige Ursachen von Speicherlecks, und wie zu erkennen sie, sonst, wenn nach „C ++ Speicher-Profiler“ + Compiler / Plattform, es gebe Links auf Memory Profiler für Ihren Compiler und Plattform, werden diese dazu beitragen, die Speicherlecks aufzuspüren durch die Beobachtung, wie Ihr Programmspeicher verwendet, wie es läuft .

Hope, das hilft.

Bearbeiten

Wie es aufzuspüren? Dies ist aus der Spitze von meinem Kopf, kann es sein, besser beraten sonst wo. . .

finden, wo der Code abstürzt, es wird sein, wenn der Inhalt einiger Zeiger zugreift (oder das Löschen eines Zeigers). Das Problem ist, dass der Zeiger entweder a) nie zugewiesen b wurde) bereits gelöscht. Gehen Sie durch alle Verweise auf Zeiger dieses Typs sind sie in Kopie ctors / Zuweisungsoperatoren verwendet?

Wenn ja, es wird Inhalt kopiert oder nur der Zeiger? Wenn nur der Zeiger dann wird die enthaltende Klasse versucht, den Zeiger zu löschen? Wenn so die erste Klasse zu sterben Erfolg hat, wird der zweite eine Zugriffsverletzung werfen.

Wenn Sie nicht explizit Code kopieren ctors und Operator =, dann sollten Sie sie verstecken (deklarieren privaten Prototypen aber setzen sie nicht), dies stoppt den Compiler von der Generierung Standardimplementierungen für Sie.

Wenn Sie sie verstecken werden Sie Compiler-Fehler überall bekommen sie benutzt werden, könnte es sein, dass Sie diese nach oben reinigen kann, oder dass Sie die Kopie Ctor und Betreiber implementieren müssen = für jede Klasse.

Ich bin im Urlaub von morgen oder zwei Wochen eine E-Mail mich direkt heute (folgen Sie dem Link auf meiner SO Benutzerseite), wenn Sie Fragen haben diese auf.

Andere Tipps

Haben Sie einen Code haben, der für debug in Ihrem Code #defined geführt wird?

d.

#ifndef _DEBUG
   //release only code such as liscensing code
#endif

Das ist eine Sache, die das Problem verursachen könnte, und ich habe in sie, bevor sie als gut geführt.

Eine andere Möglichkeit ist ein VS Problem (oder was auch immer IDE Sie verwenden). Versuchen Sie, die Freigabe .EXE direkt anstatt durch die develoment Umgebung und sehen Sie, wenn Sie immer noch das gleiche Problem haben.

Es ist eine Weile her, seit ich getan habe C ++ „im Zorn“, so zu sprechen, so dass einige (oder auch alle), was ich sage unten gut veraltet sein kann.

Sind Sie mit C ++ verwaltet? Wenn nicht, dann klingt es wie ein uninitialised Zeiger. Früher ist es der Fall, dass alle Zeiger im Debug auf Null gesetzt wurden und ich erinnere mich, etwas über dieses Verhalten ausschalten, aber ich kann die vollständigen Details im Augenblick nicht erinnern.

Sind die Überholkupplung Saiten ihre Variablen? Unwahrscheinlich mit std :: string, aber es lohnt sich zu eliminieren.

Ein paar Möglichkeiten:

Ich würde vermuten, dass Sie lesen / Vergangenheit lokale Array Ende zu schreiben. In Debugbuilds dies funktionieren kann, wird als Speicher nicht fest zugeordnet. In Version baut dies wahrscheinlicher ist es, Probleme zu verursachen, hängt davon ab, was mit dem Array direkt neben zugeordnet ist.

Eine andere Möglichkeit ist, dass Sie einen nicht initialisierten Zeiger irgendwo haben. VC Standard initialisiert lokale Variablen im Debug-Modus, aber nicht im Release-Modus. So Code wie:

int* p;
if (p != NULL) { /* do something */ }

Normalerweise schlägt auf Release-Modus.

Die Fehlermeldung stark schlagen Sie ein Speicherproblem haben, wahrscheinlich Speicher überschrieben werden. Diese sind schwer zu finden, aber Sie können einige mögliche Lösungen googeln „visual c ++ Speicherfehler-Tool“.

finden

Die Sache über Speicherfehler ist, dass es unvorhersehbar ist. Es muss nicht unbedingt irgendwelche Folgen hat, und wenn es das tut sie bei einem Crash nicht führen kann. Crashing wie das ist gut, weil es Sie informiert Sie ein Problem haben.

Das Hantieren mit Debug-vs.-Release, das Hinzufügen oder Teile des Codes zu entfernen, zu ändern Optimierungsoptionen und dergleichen sind unwahrscheinlich, das Problem zu lösen. Auch wenn es der Fall ist, ist es wahrscheinlich, bis zu beschneiden, wenn Änderungen vorgenommen werden.

Also, Sie haben einen Speicher Korruption Problem. Das ist fast immer schwer zu finden, aber es gibt Werkzeuge. Sie müssen das Problem beheben.

Sie können auch in Ihrem Shop Praktiken aussehen. Haben Sie verwenden weniger sichere Konstrukte (new Arrays statt vector<>, sagen)? Haben Sie Codierungsstandards, um zu versuchen, Risiken zu reduzieren? Haben Sie Code-Reviews haben? Speicherfehler kann heimtückisch und schädlich sein, und Sie wollen es vermeiden, so viel wie möglich.

Was ist Sie immer ist ein System Ausnahme von dem O. Diese werden nicht behandelt, weil sie nicht C ++ Ausnahme. Allerdings können Sie dann in eine C ++ Ausnahme konvertieren und sie wie eine normale Ausnahme zu fangen.

Es ist ein großer Artikel hier http: //www.thunderguy.com/semicolon/2002/08/15/visual-c-exception-handling/ (Seite 3), die zeigt, wie eine Windows-Exception-Klasse erstellen, die die Ausnahme mit der _set_se_translator Methode fangen und wirft eine C ++ Ausnahme. Die große Sache ist, dass Sie einen Stapel von der EXCEPTION_RECORD Struktur bekommen können, obwohl your'll diese Funktionalität hinzufügen, um die Struktur zu verarbeiten, aber es wird für diese Zugriffsverletzung verengt die Suche helfen.

Ich denke, das Problem hier nicht initialisierte lokale Variable ist. Im Debug-Modus im Allgemeinen erhalten die Variablen initialisiert und Sie keine Ausnahmen erhalten. Aber Fehler im Release-Modus, weil dieser auftreten können.

Versuchen Sie nicht initialisierten Variablen, deren Zugang aussehen kann Ausnahme verursachen.

Angenommen, Sie boolean lokale Variable haben.

bool bRet;

In Debug-Build bRet erhalten initailized auf 0 und der Code funktioniert gut.

Aber in Release es nicht 0 sein wird, wäre es ein zufälliger Wert und Ihr Code sein könnte auf bRet .Es etwas basieren tun kann eine Ausnahme später verursachen, weil bRet Wert falsch ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top