FIX: Liberazione di memoria pi¨ volte potrebbe causare un errore di applicazione in Visual c ++

Traduzione articoli Traduzione articoli
Identificativo articolo: 194550 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

Sintomi

Memoria che viene liberato pi¨ volte Ŕ in potrebbe essere di generano un errore dell'applicazione.

Nota : questo Ŕ true se Ŕ possibile utilizzare malloc e pi¨ libero o nuovo ed eliminazione di pi¨.

Cause

Strutture di controllo dell'heap vengono modificate dopo la prima chiamata free() e non Ŕ pi¨ in uno stato in cui le chiamate successive a free() funzionerÓ.

Risoluzione

Evitare di chiamare pi¨ libero o eliminazione di pi¨ sul puntatore stesso. Un modo per evitare questo problema consiste assegnando il puntatore a null dopo la chiamata libero o eliminare. Le funzioni libere e l'eliminazione di restituire senza eseguire qualsiasi operazione se l'argomento viene passato un puntatore null. Questo non funziona nei casi in cui Ŕ disponibile o eliminazione viene chiamato su pi¨ puntatori alla posizione di memoria stessa.

Per consentire ai clienti verifica questo problema nelle applicazioni di terze parti, Microsoft ha rilasciato una nuova DLL di libreria di C Runtime, Msvcrt.dll, che implementa due gestori di heap, il gestore di heap compatibile con Visual c ++ 5 e il gestore di heap compatibile con Visual c ++ 6. Viene rilevata la versione di Visual C++ con la quale Ŕ stata creata l'applicazione e viene utilizzato il gestore di heap appropriato. Se questa versione 6.0 o versione successiva, viene utilizzato il gestore di heap compatibile con Visual c ++ 6 e se Ŕ precedente alla versione 6.0, che viene utilizzato l'heap compatibile con Visual c ++ 5.

Visual Studio 6.0 gli utenti possono ottenere questo nuovo msvcrt.dll installando il Microsoft Visual Studio Service Pack pi¨ recente. Gli utenti non-Visual Studio Ŕ necessario installare l'aggiornamento delle librerie Microsoft.

Status

Microsoft ha confermato che questo un bug in Microsoft i prodotti 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 riportato di seguito:

194022Visual Studio 6.0 service pack, che cosa, dove, perchÚ

194295Come riconoscere che Ŕ installato un service pack di Visual Studio

Informazioni

Liberare memoria pi¨ volte produce un comportamento indefinito.

Il codice non causa un errore di applicazione creati con Visual c ++ 5.0 Build di rilascio del codice di esempio riportato di seguito causa un errore durante la generazione con Visual c ++ 6.0.

Build di debug con entrambi Visual c ++ 6.0 o Visual c ++ 5.0 emettere un ASSERT:
   Debug Assertion Failed!
				

╚ importante tenere presente che lo stato dell'heap di blocco Small (SBH) Ŕ costantemente continuativa. Di conseguenza, esistono situazioni in cui Ŕ possibile che l'asserzione non verrÓ emesso nella build di debug, ma si verifica un errore dell'applicazione in build di rilascio.

Build di rilascio in Visual c ++ 6.0 sono pi¨ sensibili a liberare memoria pi¨ volte da quello in Visual c ++ 5.0. Se viene creata con Visual c ++ 5.0, il caso riportato di seguito Ŕ uno in cui 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. ╚ presente un'alta probabilitÓ che la memoria risulterÓ 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Ó

Identificativo articolo: 194550 - Ultima modifica: sabato 4 giugno 2005 - Revisione: 3.0
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Chiavi:á
kbmt kberrmsg kbqfe kbbug kbcode kbcrt kbfix kbvs600sp2fix kbvs600sp3fix KB194550 KbMtit
Traduzione automatica articoli
Il presente articolo Ŕ stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell?utente. Tuttavia, un articolo tradotto in modo automatico non Ŕ sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, pi¨ o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non Ŕ la sua. Microsoft non Ŕ responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell?utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell?articolo: 194550
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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