Update: Speicherfreigabe mehrmals Anwendungsfehler in Visual C++ kann

Problembeschreibung

Mehrfach freigegebenen Speichers verursachen einen Anwendungsfehler.

Hinweis: Dies trifft, ob Malloc und mehrere frei oder neuer verwenden und mehrere löschen.

Ursache

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

Problemlösung

Vermeiden mehrerer frei oder mehrere auf denselben Zeiger löschen. Dies verhindert werden durch Zuweisen des Zeigers null nach freien aufrufen oder löschen. Löschen und freien Funktionen zurückgeben, ohne etwas zu tun, wenn ein null-Zeiger als Argument übergeben wird. Dies funktioniert nicht bei, freie oder löschen auf mehrere Verweise auf dieselbe Speicherstelle aufgerufen wird.

Damit Kunden dieses Problem in der Fremdanbieter-Anwendung auftritt, hat Microsoft eine neue C-Laufzeit-Bibliothek-DLL Msvcrt.dll veröffentlicht zwei Heap-Manager, den Visual C++ 5-kompatiblen Heap-Manager und den Visual C++ 6-kompatiblen Heap-Manager implementiert. Mit der Visual C++-Version Ihre Anwendung erstellt wurde und verwendet den entsprechenden Heap-Manager für diese Anwendung erkannt. Ist diese Version 6.0 oder höher wird der Visual C++ 6-kompatiblen Heap-Manager verwendet, und wenn es älter als Version 6.0 ist, der Visual C++ 5-kompatible Heap verwendet.

Visual Studio 6.0-Benutzer erhalten diese neuen msvcrt.dll durch Installieren des neuesten Microsoft Visual Studio Service-Packs. Nicht-Visual Studio-Benutzer sollten das Microsoft Bibliotheken-Update installieren.

Status

Microsoft hat bestätigt, dass es sich um einen Fehler in den Microsoft-Produkten handelt, die zu Beginn dieses Artikels aufgeführt sind.

Dieser Bug wurde in Visual Studio 6.0 Service Pack 3 behoben.
Weitere Informationen zu Visual Studio Servicepacks finden Sie in folgenden Artikeln der Microsoft Knowledge Base:

194022 Visual Studio 6.0 Service packs-Inhalt, wo, warum

194295 ermitteln, ob ein Visual Studio Service pack installiert ist

Weitere Informationen

Speicherfreigabe mehrmals wird nicht definiert.


Releasebuilds des Beispielcodes unter Ursache einen Anwendungsfehler mit Visual C++ 6.0; der Code bewirkt keine Anwendungsfehler beim Erstellen mit Visual C++ 5.0.

Debugbuilds Visual C++ 6.0 oder Visual C++ 5.0 Problem eine Bestätigung:
   Debug Assertion Failed!

Es ist wichtig zu beachten, dass der Small Block Heap (SBH) ständig in Bewegung ist. Deshalb gibt es Situationen, in denen es möglich keine Assertion im Debugbuild ausgegeben, dass Anwendungsfehler auftreten, im Release-Build.

Releasebuilds in Visual C++ 6.0 sind Speicherfreigabe mehrmals als Visual C++ 5.0. Mit Visual C++ 5.0 erstellt, gilt folgende eine ist der falsche Aufruf frei harmlos. Wenn der Aufruf free() mehr vom Original entfernt wurden, kann ein Anwendungsfehler. 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

Artikelnummer: 194550 – Letzte Überarbeitung: 23.01.2017 – Revision: 1

Feedback