Share via


_get_purecall_handler, _set_purecall_handler

Obtém ou define o manipulador de erro para uma chamada de função virtual pura.

Sintaxe

typedef void (__cdecl* _purecall_handler)(void);
_purecall_handler __cdecl _get_purecall_handler(void);
_purecall_handler __cdecl _set_purecall_handler(
   _purecall_handler function
);

Parâmetros

function
A função a ser chamada quando uma função virtual pura é chamada. Uma função _purecall_handler deve ter um tipo de retorno nulo.

Retornar valor

O _purecall_handler anterior. Retorna nullptr se não houver manipulador anterior.

Comentários

As funções _get_purecall_handler e _set_purecall_handler são específicas da Microsoft e se aplicam somente a código C++.

Uma chamada para uma função virtual pura é um erro porque não tem nenhuma implementação. Por padrão, o compilador gera código para invocar uma função de manipulador de erro quando uma função virtual pura é chamada, o que encerra o programa. Você pode instalar sua própria função de manipulador de erro para chamadas de função pura virtual, para capturá-las para fins de depuração ou relatório. Para usar seu próprio manipulador de erro, crie uma função que tenha a assinatura _purecall_handler e use _set_purecall_handler para torná-lo o manipulador atual.

Como há apenas um _purecall_handler para cada processo, quando você o chama _set_purecall_handler afeta imediatamente todos os threads. O último chamador em qualquer thread define o manipulador.

Para restaurar o comportamento padrão, chame _set_purecall_handler usando um argumento nullptr.

Requisitos

Rotina Cabeçalho necessário
_get_purecall_handler, _set_purecall_handler <cstdlib> ou <stdlib.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

// _set_purecall_handler.cpp
// compile with: /W1
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>

class CDerived;
class CBase
{
public:
   CBase(CDerived *derived): m_pDerived(derived) {};
   ~CBase();
   virtual void function(void) = 0;

   CDerived * m_pDerived;
};

class CDerived : public CBase
{
public:
   CDerived() : CBase(this) {};   // C4355
   virtual void function(void) {};
};

CBase::~CBase()
{
   m_pDerived -> function();
}

void myPurecallHandler(void)
{
   printf("In _purecall_handler.");
   exit(0);
}

int _tmain(int argc, _TCHAR* argv[])
{
   _set_purecall_handler(myPurecallHandler);
   CDerived myDerived;
}
In _purecall_handler.

Confira também

Tratamento de erros
_purecall