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 | Reduzir tudo

Sintomas

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

Causa

Em versões de depuração, MFC define uma macro de pré-processador que expande o operador de Novo para um operador sobrecarregado Novo assume dois parâmetros adicionais. Os parâmetros adicionais são o origem ficheiro indicativo e nome do número de linha. MFC pode utilizar estas informações para reportar fugas de memória para o programador quando em modo de depuração. Isto funciona para as classes MFC porque MFC fornece sobrecargas para Nova que aceitam parâmetros adicionais.

No entanto, uma vez que esta expansão é efectuada através da pré-processador, afecta todos os utilização do operador Novo . Se as classes MFC não forem utilizadas no projecto, os respectivos Novo operador também estiver expandida, mesmo que nenhuma sobrecarga adequada de Novo esteja disponível dessa classe. Este é o que acontece na GDI + e, como resultado, recebe uma mensagem de erro em tempo de compilação.

Como contornar

Para contornar este problema, escolha um dos seguintes métodos:
  • Desactivar a expansão de pré-processador comentar as seguintes linhas de código no ficheiro de origem:
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif
    						
    Nota : Este método tem a desvantagem da utilização não funcionalidades MFC que ajudam a controlar atribuições de memória e fugas.
  • Fornece GDI + sobrecargas para Novo e Eliminar operadores escrevendo algum código que aceita e ignora os parâmetros adicionais. Pode colar o seguinte código, demonstra esta abordagem, num novo ficheiro de cabeçalho e incluir o novo ficheiro de cabeçalho em vez do ficheiro 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")
    					

Ponto Da Situação

Este comportamento ocorre por predefinição.

A informação contida neste artigo aplica-se a:
  • Microsoft GDI+ 1.0
  • Microsoft Windows XP Professional Edition
  • 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 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: 317799  (http://support.microsoft.com/kb/317799/en-us/ )