Pregunta

Me encontró un problema al migrar nuestro código C ++ desde VS2008 a VS2010. No puedo encontrar una explicación por la razón de que hasta el momento y apreciarán su ayuda.

Tenemos un asignador de memoria a medida y que reside en un archivo DLL. En el resto del código se utiliza el preprocesador para redirigir las asignaciones a nuestras funciones. Thie siguiente código simple compila correctamente en VS2008, pero no lo hace en VS2010.

en stdafh.h:

#define free my_free
#include <string>

En VS2010 me sale:

1>d:\program files\microsoft visual studio 10.0\vc\include\xdebug(62): error C3861: 'free': identifier not found

Desde la línea:

template<class _Ty>
    void __CLRCALL_OR_CDECL _DebugHeapDelete(_Ty *_Ptr)
    {   // delete from the debug CRT heap even if operator delete exists
    if (_Ptr != 0)
        {   // worth deleting
        _Ptr->~_Ty();
        // delete as _NORMAL_BLOCK, not _CRT_BLOCK, since we might have
        // facets allocated by normal new.
        free(_Ptr);

Cualquier ayuda o las ideas será muy apreciada!

Moshe

¿Fue útil?

Solución 2

Después de algunas investigaciones utilizando la opción / P para crear los archivos del preprocesador y el estudio de ellos he encontrado la causa raíz del problema.

La cabecera Xdebug, que se describe como "cabecera apoyo montón de depuración para Microsoft", contiene las siguientes líneas:

#pragma push_macro("free")
#undef free

que obviamente derrotar a nuestros intentos de redefinir la misma. Así que esto no es algo nuevo para el compilador, simplemente #undef claro que pasa a ocurrir con las funciones que tratamos de redefinir

Otros consejos

De acuerdo con el estándar ISO C ++, la sección 17.4.3.1.1.2:

Una unidad de traducción que incluye una cabecera no contendrá ninguna macro que definen nombres declarada o se define en dicha cabecera. Tampoco será una unidad de dicha traducción definir macros para los nombres léxico idénticas a las palabras clave.

Esto significa que no es legal a #define un nombre de función de biblioteca a significar otra cosa. Supongo que esto acaba de pasar a trabajar en VS2008, pero al migrar a VS2010 los autores del compilador ocurrió una aplicación en la que esto no funciona correctamente.

Si desea volver a definir lo que hace free, sugiero hacerlo a través de un canal más convencional al vincular el código en contra de su propia implementación de la librería C que cambia el comportamiento predeterminado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top