ID do artigo: 317799 - Última revisão: segunda-feira, 12 de fevereiro de 2007 - Revisão: 2.1

PROBLEMA: O Microsoft Foundation Classes DEBUG_NEW não funciona com GDI +

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.
Expandir tudo | Recolher tudo

Sintomas

Quando você cria uma versão de depuração de um aplicativo MFC (Microsoft Foundation Classes) que usa o GDI +, você receberá uma mensagem de erro semelhante à seguinte:
Erro C2660: 'Gdiplus::GdiplusBase::operator novo': função não requer 3 parâmetros

Causa

Em compilações de depuração, o MFC define uma macro pré-processador que expande o novo operador para um operador sobrecarregado novo que usa dois parâmetros extras. Os parâmetros extras são o número de linha do origem arquivo nome e código. MFC pode usar essas informações para reportar vazamentos de memória para o programador quando no modo de depuração. Isso funciona para classes MFC porque MFC fornece sobrecargas para novo que aceitam parâmetros extras.

No entanto, porque essa expansão é feita pelo pré-processador, afeta todos os uso do novo operador. Se as classes MFC não forem usadas no projeto, seu novo operador também estiver expandido, mesmo que nenhuma sobrecarga adequada do novo esteja disponível nessa classe. Isso é o que acontece no GDI + e, como resultado, você recebe uma mensagem de erro de tempo de compilação.

Como Contornar

Para contornar este problema, escolha um dos seguintes métodos:
  • Desativar a expansão de pré-processador, comentar as seguintes linhas de código no arquivo de origem:
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    						
    Observação : esse método tem a desvantagem de não usar recursos do MFC que ajudam você controlar as alocações de memória e vazamentos.
  • Fornecer GDI + sobrecargas para operadores novos e Excluir escrevendo um código que aceita e descarta os parâmetros adicionais. Você pode colar o código a seguir, que demonstra essa abordagem, em um novo arquivo de cabeçalho e incluir o novo arquivo de cabeçalho em vez do arquivo 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")
    					

Situação

Esse comportamento é por design.

A informação contida neste artigo aplica-se a:
  • Microsoft GDI+ 1.0
  • Microsoft Windows XP Professional
  • the operating system: Microsoft Windows XP 64-Bit Edition
Palavras-chave: 
kbmt kbdswgdi2003swept kbprb KB317799 KbMtpt
Tradução automáticaTraduçã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: 317799  (http://support.microsoft.com/kb/317799/en-us/ )