REVISIÓN: Liberar memoria varias veces podría provocar un error de aplicación en C++

Seleccione idioma Seleccione idioma
Id. de artículo: 194550 - Ver los productos a los que se aplica este artículo
Expandir todo | Contraer todo

En esta página

Síntomas

Memoria que se libera varias veces puede producir un error de aplicación.

Nota : es true si utiliza malloc y varios libre o nueva y eliminar varios.

Causa

Estructuras de control del montón se modifican después de la primera llamada a free() y no en un estado donde las llamadas subsiguientes a free() funcionará.

Solución

Evite llamar a múltiples libre o eliminar varios en el mismo puntero. Una forma de evitarlo es asignando el puntero a null después de llamar a libre o eliminar. La eliminación y funciones libres devolver sin hacer nada si se pasa un puntero nulo como argumento. Eliminar se llama a en varios punteros que señala a la misma ubicación de memoria o esto no funciona en casos donde libre.

Para ayudar a los clientes experimentando este problema en sus aplicaciones de terceros, Microsoft ha publicado una nueva DLL de biblioteca de tiempo de ejecución de C, Msvcrt.dll, que implementa dos administradores de montón, el administrador del montón compatible Visual C++ 5 y el administrador del montón compatible con Visual C++ 6. Msvcrt.dll detecta la versión de Visual C++ con la que la aplicación está desarrollada y utiliza el administrador de pila correspondiente. Si esta versión 6.0 o posterior, se utiliza el administrador del montón compatible con Visual C++ 6 y si es anterior a versión 6.0, se utiliza el montón compatible con Visual C++ 5.

Visual Studio 6.0 a los usuarios pueden Obtenga este nuevo msvcrt.dll instalando el Microsoft Visual Studio Service Pack más reciente. Sin Visual Studio usuarios deben instalar la actualización de bibliotecas de Microsoft.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados al principio de este artículo.
Este error se corrigió en Visual Studio 6.0 Service Pack 3. Para obtener más información acerca de los service packs de Visual Studio, consulte en contacto con los artículos siguientes en Microsoft Knowledge Base:

194022Service Pack de Visual Studio 6.0: qué son, dónde están y por qué son necesarios

194295Cómo saber que está instalado un service pack de Visual Studio

Más información

Liberar memoria varias veces, produce un comportamiento indefinido.

Lanzamiento del código de ejemplo siguiente causa un error de aplicación cuando crea con Visual C++ 6.0; el código no produce un error de aplicación cuando crea con Visual C++ 5.0.

Versiones de depuración con cualquier Visual C++ 6.0 o Visual C++ 5.0 emitir una aserción ASSERT:
   Debug Assertion Failed!
				

Es importante observar que el estado del montón del bloque Small (SBH) está constantemente en inestable. Debido a esto, no hay situaciones donde es posible que no se emitirá ninguna aserción en la generación de depuración, pero se producirá un error de aplicación en la versión de lanzamiento.

Las versiones de lanzamiento en Visual C++ 6.0 son más sensibles a liberar memoria que varias veces en Visual C++ 5.0. Si ha creado con Visual C++ 5.0, el siguiente caso es uno donde la llamada incorrecta a liberar inocua. Si la llamada a free() se han realizado más distante de la original, es posible provocar un error de aplicación. Hay una probabilidad alta que la memoria se dañará.

Código de ejemplo

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

Propiedades

Id. de artículo: 194550 - Última revisión: sábado, 04 de junio de 2005 - Versión: 3.0
La información de este artículo se refiere a:
  • Microsoft Visual C++ 6.0 Enterprise
  • Microsoft Visual C++ 6.0 Professional
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Palabras clave: 
kbmt kberrmsg kbqfe kbbug kbcode kbcrt kbfix kbvs600sp2fix kbvs600sp3fix KB194550 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 194550

Enviar comentarios

 

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