PRB: Microsoft Foundation Classes DEBUG_NEW no funciona con GDI+

Síntomas

Al generar una versión de depuración de una aplicación Microsoft Foundation Classes (MFC) que utiliza GDI+, puede recibir un mensaje de error similar al siguiente:
error error C2660: 'Gdiplus::GdiplusBase::operator nueva': la función no acepta 3 parámetros

Causa

En compilaciones de depuración, MFC define la macro de preprocesador que se expande el nuevo operador a un operador sobrecargado nuevo que toma dos parámetros adicionales. Los parámetros adicionales son el número de línea de nombre y el código de archivo de origen. MFC puede utilizar esta información para notificar pérdidas de memoria al programador cuando está en modo de depuración. Esto funciona para las clases MFC como MFC proporciona sobrecargas para nuevo que acepten los parámetros adicionales.

Sin embargo, dado que esta expansión se realiza por el preprocesador, afecta a todo el uso del operador new . Si las clases de MFC no se utilizan en el proyecto, también se amplía su nuevo operador, aunque no esté disponible en esa clase ninguna sobrecarga adecuada de nuevo . Esto es lo que ocurre en GDI+ y, como resultado, recibirá un mensaje de error en tiempo de compilación.

Solución alternativa

Para evitar este problema, elija uno de los métodos siguientes:

  • Desactivar la expansión preprocesador, comentar las siguientes líneas de código en el archivo de origen:

    #ifdef _DEBUG#define new DEBUG_NEW
    #endif

    Nota: este método tiene la desventaja de no utilizar características de MFC que le ayudarán a realizar un seguimiento de las asignaciones de memoria y pérdidas.
  • Proporcionar GDI+ con sobrecargas de los operadores new y delete escribiendo código que acepta y descarta los parámetros adicionales. Puede pegar el siguiente código, que se muestra en este enfoque, en un nuevo archivo de encabezado e incluir el nuevo archivo de encabezado en lugar del archivo Gdiplus.h.
    //// Ensure that GdiPlus header files work properly with MFC DEBUG_NEW and STL header files.
    #define iterator _iterator

    #ifdef _DEBUG

    namespace Gdiplus
    {
    namespace DllExports
    {
    #include <GdiplusMem.h>
    };

    #ifndef _GDIPLUSBASE_H
    #define _GDIPLUSBASE_H
    class GdiplusBase
    {
    public:
    void (operator delete)(void* in_pVoid)
    {
    DllExports::GdipFree(in_pVoid);
    }

    void* (operator new)(size_t in_size)
    {
    return DllExports::GdipAlloc(in_size);
    }

    void (operator delete[])(void* in_pVoid)
    {
    DllExports::GdipFree(in_pVoid);
    }

    void* (operator new[])(size_t in_size)
    {
    return DllExports::GdipAlloc(in_size);
    }

    void * (operator new)(size_t nSize, LPCSTR lpszFileName, int nLine)
    {
    return DllExports::GdipAlloc(nSize);
    }

    void operator delete(void* p, LPCSTR lpszFileName, int nLine)
    {
    DllExports::GdipFree(p);
    }

    };
    #endif // #ifndef _GDIPLUSBASE_H
    }
    #endif // #ifdef _DEBUG

    #include <gdiplus.h>
    #undef iterator
    //// Ensure that Gdiplus.lib is linked.
    #pragma comment(lib, "gdiplus.lib")

Estado

Este comportamiento es por diseño.
Propiedades

Id. de artículo: 317799 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios