CORRECÇÃO: Liberar memória várias vezes pode causar um erro de aplicativo no Visual C++

Traduções deste artigo Traduções deste artigo
ID do artigo: 194550 - Exibir os produtos aos quais esse artigo se aplica.
Expandir tudo | Recolher tudo

Neste artigo

Sintomas

Memória que é liberada várias vezes pode causar um erro de aplicativo.

Observação : Este é true se você usar malloc e vários novos ou livre e excluir vários.

Causa

Estruturas de controle de heap são modificadas após a primeira chamada para free() e não em um estado em que as chamadas subseqüentes para free() funcionará.

Resolução

Evitar chamar várias livre ou excluir vários no mesmo ponteiro. Uma maneira para evitar que isso é atribuindo o ponteiro para nulo após chamar livre ou excluir. As funções livres e excluir retornam sem fazer nada se um ponteiro nulo é passado como o argumento. Isso não funcionar em casos onde livre ou exclusão é chamado nos vários ponteiros apontando para o mesmo local da memória.

Para ajudar os clientes com esse problema em seus aplicativos de terceiros, a Microsoft lançou uma nova DLL de biblioteca de C-Run-time, Msvcrt.dll, que implementa dois gerenciadores de heap, o Gerenciador de heap compatível do Visual C++ 5 e o Gerenciador de heap compatível do Visual C++ 6. Ele detecta com qual versão do Visual C++ o seu aplicativo é criado e usa o Gerenciador de heap apropriado para o aplicativo. Se esta versão for 6.0 ou posterior, o Gerenciador de heap compatível do Visual C++ 6 será usado e se é anterior à versão 6.0, a heap compatível do Visual C++ 5 é usada.

O Visual Studio 6.0 usuários possam obter este novo msvcrt.dll instalando o Microsoft Visual Studio Service Pack mais recente. Os usuários não-Visual Studio devem instalar o Microsoft Libraries Update.

Situação

A Microsoft confirmou que este é um bug no Microsoft produtos que estão listados no início deste artigo.
Esse bug foi corrigido no Visual Studio 6.0 Service Pack 3. Para obter mais informações sobre service packs do Visual Studio, consulte os seguintes artigos na Base de dados de Conhecimento da Microsoft:

194022O Visual Studio 6.0 service packs, o que, em que, por que

194295Como saber se um service pack do Visual Studio está instalado

Mais Informações

Liberar memória várias vezes produz comportamento indefinido.

Compilações de versão do código de exemplo abaixo causa um erro de aplicativo quando criados com Visual C++ 6.0; o código não causa um erro de aplicativo quando criados com Visual C++ 5.0.

Compilações de depuração com o Visual C++ 6.0 ou Visual C++ 5.0 emitir uma declaração:
   Debug Assertion Failed!
				

É importante observar que o estado da heap de bloco Small (SBH) está constantemente no fluxo. Devido a isso, há situações onde é possível que nenhuma declaração será emitida na compilação de depuração, mas um erro do aplicativo ocorrerá na compilação de lançamento.

Compilações no Visual C++ 6.0 são mais sensíveis a liberação de memória várias vezes que no Visual C++ 5.0. Se criado com o Visual C++ 5.0, o caso abaixo é um onde a chamada incorreta para liberar é inofensiva. Se a chamada para free() tiverem sido feita mais distante do original, é possível causar um erro de aplicativo. Há uma probabilidade alta que a memória será estar corrompida.

Código de exemplo

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

Propriedades

ID do artigo: 194550 - Última revisão: sábado, 4 de junho de 2005 - Revisão: 3.0
A informação contida neste artigo aplica-se a:
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palavras-chave: 
kbmt kberrmsg kbqfe kbbug kbcode kbcrt kbfix kbvs600sp2fix kbvs600sp3fix KB194550 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 194550

Submeter comentários

 

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