Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

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

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
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;   }				
Msvcrt.dll kbVS600sp2

Warnung: Dieser Artikel wurde automatisch übersetzt.

Eigenschaften

Artikelnummer: 194550 – Letzte Überarbeitung: 06/04/2005 20:14:16 – Revision: 3.0

Microsoft Visual C++ 6.0 Enterprise Edition, Microsoft Visual C++ 6.0 Professional Edition, Microsoft Visual C++, 32-bit Learning Edition 6.0

  • kbmt kberrmsg kbqfe kbbug kbcode kbcrt kbfix kbvs600sp2fix kbvs600sp3fix KB194550 KbMtde
Feedback