FIX: Liberare memoria più volte potrebbe causare un errore dell'applicazione in Visual C++

Sintomi

Memoria più volte potrebbe causare un errore dell'applicazione.

Nota: questo è vero se si utilizza malloc e più libero o nuovo ed eliminare più.

Causa

Strutture di controllo di heap vengono modificate dopo la prima chiamata a Free () e non è più in uno stato in cui le chiamate successive a Free () funziona.

Risoluzione

Evitare di chiamare più libero o eliminazione di più sul puntatore stesso. Un modo per evitare questa situazione è assegnando il puntatore a null dopo la chiamata gratuita o eliminare. L'eliminazione e le funzioni disponibili restituiscono non esegue alcuna operazione se un puntatore null viene passato come argomento. Questo non funziona nei casi dove libero o eliminazione viene chiamato su più puntatori che puntano alla stessa posizione di memoria.

Per aiutare i clienti che riscontrano questo problema nelle applicazioni di terze parti, Microsoft ha rilasciato una nuova DLL di libreria di runtime C, Msvcrt. dll che implementa due gestori di heap, il gestore di heap compatibile Visual C++ 5 e il gestore di heap compatibile Visual C++ 6. Rileva con la versione di Visual C++ viene compilata l'applicazione e viene utilizzato il gestore di heap appropriato per tale applicazione. Se tale versione 6.0 o versione successiva, viene utilizzato il gestore di heap compatibile Visual C++ 6 e se è precedente alla versione 6.0, viene utilizzato l'heap compatibile con Visual C++ 5.

Gli utenti di Visual Studio 6.0 è possono ottenere questo nuovo file Msvcrt. dll mediante l'installazione di Microsoft Visual Studio Service Pack più recente. Gli utenti non-Visual Studio è necessario installare l'aggiornamento delle librerie Microsoft.

Stato

Microsoft ha confermato che questo problema si verifica nei prodotti Microsoft elencati all'inizio di questo articolo.

Questo problema è stato risolto in Visual Studio 6.0 Service Pack 3.
Per ulteriori informazioni sui service pack di Visual Studio, vedere i seguenti articoli della Microsoft Knowledge Base:

194022 visual Studio 6.0 service pack, che cosa, dove, perché

194295 come stabilire se è installato un service pack di Visual Studio

Ulteriori informazioni

Liberare memoria più volte produce un comportamento indefinito.


Generazioni di rilascio del codice di esempio sotto causa un errore dell'applicazione quando compilato con Visual C++ 6.0; il codice non causa un errore dell'applicazione quando compilato con Visual C++ 5.0.

Generazioni di debug con Visual C++ 6.0 o Visual C++ 5.0 problema un'ASSERZIONE:
   Debug Assertion Failed!

È importante notare che lo stato del piccolo blocco Heap (SBH) è costantemente cambiamenti. Per questo motivo, esistono situazioni in cui è possibile che non verrà emesso alcun asserzione nelle build di debug, ma si verifica un errore di applicazione nelle build di rilascio.

Le build di rilascio in Visual C++ 6.0 sono più sensibili a liberare memoria più volte rispetto a Visual C++ 5.0. Se compilato con Visual C++ 5.0, nel caso seguente è uno dove la chiamata non corretta per liberare innocua. Se la chiamata a Free () sono stata apportata più distante dall'originale, è possibile causare un errore dell'applicazione. Non c'è un'alta probabilità che la memoria verrà danneggiata.

Codice di esempio

   // 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;
}

Proprietà

ID articolo: 194550 - Ultima revisione: 29 gen 2017 - Revisione: 1

Feedback