Update: Freigeben von Speicher mehrmals einen Anwendungsfehler in Visual C++ verursacht möglicherweise

SPRACHE AUSWÄHLEN SPRACHE AUSWÄHLEN
Artikel-ID: 194550 - Produkte anzeigen, auf die sich dieser Artikel bezieht
Alles erweitern | Alles schließen

Auf dieser Seite

Problembeschreibung

Speicher, der mehrmals freigegeben wird möglicherweise einen Anwendungsfehler.

Hinweis : dieser true ist, ob Sie Malloc und mehrere frei oder neue verwenden und mehrere löschen.

Ursache

Heap-Kontrollstrukturen werden geändert, nach dem ersten Aufruf free() und nicht mehr in einen Zustand, in denen nachfolgende Aufrufe von free() funktionieren.

Lösung

Vermeiden Sie mehrere kostenlose aufrufen oder mehrere löschen auf dem gleichen Zeiger. Eine Möglichkeit, dies zu verhindern, ist durch Zuweisen des Zeigers auf null nach dem Aufruf frei oder löschen. Die löschen und kostenlose Funktionen zurück, ohne etwas tun, wenn ein null-Zeiger als Argument übergeben wird. Dies funktioniert nicht in Fällen, frei, oder löschen auf mehrere Zeiger auf die gleiche Speicherposition verweist aufgerufen wird.

Damit Kunden, die dieses Problem in Ihren Anwendungen von Drittanbietern auftritt, hat Microsoft eine neue C Runtime Library DLL Msvcrt.dll, veröffentlicht die zwei Heap-Manager, der Visual C++ 5-kompatible Heap-Manager und den Visual C++ 6-kompatiblen Heap-Manager implementiert. Die Datei erkennt, mit welcher Visual C++-Version Ihre Anwendung erstellt wurde, und verwendet den entsprechenden Heap-Manager für diese Anwendung. Wenn diese Version 6.0 oder höher ist, der Visual C++ 6-kompatiblen Heap-Manager verwendet wird und wenn Sie älter als Version 6.0, Visual C++ 5 kompatible Heap wird verwendet.

Visual Studio 6.0 können Benutzer diese neue msvcrt.dll abrufen, indem Installieren des neuesten Microsoft Visual Studio Service Pack. Nicht-Visual Studio-Benutzer sollten das Microsoft Bibliotheken-Update installieren.

Status

Microsoft hat bestätigt, dass es sich hierbei um ein Problem bei den in diesem Artikel Microsoft-Produkten handelt.
Dieser Bug wurde in Visual Studio 6.0 Service Pack 3 behoben. Weitere Informationen zu Visual Studio Servicepacks finden Sie in die folgenden Artikeln der Microsoft Knowledge Base:

194022Visual Studio 6.0 Service packs, was, wo, warum

194295Wie Sie feststellen, dass ein Visual Studio Servicepack installiert ist

Weitere Informationen

Freigeben von Speicher mehrmals erzeugt nicht definiertes Verhalten.

Releasebuilds des Beispielcodes unten Ursache einen Anwendungsfehler beim Visual C++ 6.0 integriert; verursacht der Code einen Anwendungsfehler beim Visual C++ 5.0 integriert.

Debugbuilds mit entweder Visual C++ 6.0 oder Visual C++ 5.0 ASSERT ausgeben:
   Debug Assertion Failed!
				

Es ist wichtig zu beachten den Zustand des Small Block-Heap (SBH) ist ständig in Flux. Aufgrund sind, es Situationen, in denen es möglich ist keine Assertion in der Debugbuild ausgegeben, aber ein Anwendungsfehler werden im Releasebuild auftreten.

Releasebuilds in Visual C++ 6.0 ist mehr Speicherfreigabe mehrmals als in Visual C++ 5.0 abhängig. Wenn mit Visual C++ 5.0 erstellt, ist der Fall unten eine wobei der falsche Aufruf von Frei harmlos. Wenn der Aufruf von free() mehr aus der ursprünglichen entfernte vorgenommen wurden, ist es möglich einen Anwendungsfehler verursachen. Besteht eine hohe Wahrscheinlichkeit, dass der Speicher beschädigt.

Beispielcode

   // Compile options for Release builds /c
   // Compile options for Debug builds /c /Zi
   #include <malloc.h>
   int main(int argc, char* argv[])
   {
      char *pChar1 = (char *)malloc(10*sizeof(char));
      char *pChar2 = (char *)malloc(10*sizeof(char));
      free(pChar1);
      free(pChar1);
      return 0;
   }
				

Eigenschaften

Artikel-ID: 194550 - Geändert am: Samstag, 4. Juni 2005 - Version: 3.0
Die Informationen in diesem Artikel beziehen sich auf:
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Keywords: 
kbmt kberrmsg kbqfe kbbug kbcode kbcrt kbfix kbvs600sp2fix kbvs600sp3fix KB194550 KbMtde
Maschinell übersetzter Artikel
Wichtig: Dieser Artikel wurde maschinell und nicht von einem Menschen übersetzt. Die Microsoft Knowledge Base ist sehr umfangreich und ihre Inhalte werden ständig ergänzt beziehungsweise überarbeitet. Um Ihnen dennoch alle Inhalte auf Deutsch anbieten zu können, werden viele Artikel nicht von Menschen, sondern von Übersetzungsprogrammen übersetzt, die kontinuierlich optimiert werden. Doch noch sind maschinell übersetzte Texte in der Regel nicht perfekt, insbesondere hinsichtlich Grammatik und des Einsatzes von Fremdwörtern sowie Fachbegriffen. Microsoft übernimmt keine Gewähr für die sprachliche Qualität oder die technische Richtigkeit der Übersetzungen und ist nicht für Probleme haftbar, die direkt oder indirekt durch Übersetzungsfehler oder die Verwendung der übersetzten Inhalte durch Kunden entstehen könnten.
Den englischen Originalartikel können Sie über folgenden Link abrufen: 194550
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.

Ihr Feedback an uns

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com