CORRECÇÃO: Como libertar memória várias vezes poderá provocar um erro de aplicação na Visual C++

Traduções de Artigos Traduções de Artigos
Artigo: 194550 - Ver produtos para os quais este artigo se aplica.
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Memória que é libertada várias vezes pode causar um erro de aplicação.

Nota : Esta é verdadeira se utilizar malloc e várias novas ou livre e eliminar múltiplos.

Causa

Pilha estruturas de controlo são modificadas após a primeira chamada para free() e não num estado em que as chamadas subsequentes para free() funcionará.

Resolução

Evitar chamar vários livre ou eliminar múltiplos no mesmo ponteiro. Uma forma para evitar esta situação é atribuindo o ponteiro para nulo depois de chamar livre ou eliminar. A eliminar e livres funções devolvem sem fazer nada se é passado um ponteiro nulo como argumento. Isto não funciona em casos onde livre ou eliminar denomina-se em vários ponteiros apontando para a mesma localização de memória.

Para ajudar os clientes que tenham este problema nas suas aplicações terceiros, a Microsoft lançou uma DLL de biblioteca de tempo de execução C novo, Msvcrt.dll, que implementa dois gestores de área dinâmica para dados, o Gestor de pilha compatível do Visual C++ 5 e o Gestor de pilha compatível Visual C++ 6. Detectar com a versão do Visual C++ a aplicação é criada e utiliza o Gestor de pilha adequado para essa aplicação. Se esta versão 6.0 ou superior, o Gestor de pilha compatível Visual C++ 6 é utilizado e se for anterior à versão 6.0, a pilha compatível Visual C++ 5 é utilizada.

Visual Studio 6.0 utilizadores podem obter este novo msvcrt.dll instalando o Microsoft Visual Studio Service Pack mais recente. Os utilizadores não-Visual Studio devem instalar a actualização das bibliotecas Microsoft.

Ponto Da Situação

A Microsoft confirmou que este é um erro no Microsoft produtos listados no início deste artigo.
Este erro foi corrigido no Visual Studio 6.0 Service Pack 3. Para mais informações sobre service packs do Visual Studio, consulte os seguintes artigos na base de dados de conhecimento da Microsoft:

194022Visual Studio 6.0 service packs, o que, em que, por que razão

194295Como saber que um Visual Studio service pack está instalado

Mais Informação

Libertar memória várias vezes produz o comportamento não definido.

Versão cria do código de exemplo abaixo causa um erro de aplicação quando criado com o Visual C++ 6.0; o código não causa um erro de aplicação quando criado com o Visual C++ 5.0.

Depuração cria com o Visual C++ 6.0 ou Visual C++ 5.0 emitir um ASSERT:
   Debug Assertion Failed!
				

É importante notar que o estado do Heap Block Small (SBH) está constantemente a ser flux. Deste modo, existem situações em que é possível que não asserção será emitida na compilação de depuração, mas irá ocorrer um erro de aplicação a compilação de edição.

Versões versão no Visual C++ 6.0 são mais importantes para libertar memória várias vezes do que no Visual C++ 5.0. Se criado com o Visual C++ 5.0, caso abaixo é uma em que a chamada incorrecta para libertar inócua. Se a chamada para free() efectuada mais distante do original, é possível provocar um erro de aplicação. Existe uma probabilidade alta que a memória ficarão danificada.

Exemplo de código

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

Artigo: 194550 - Última revisão: 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 revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes 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