_get_purecall_handler, _set_purecall_handler

Získá nebo nastaví obslužnou rutinu chyby pro čistě virtuální volání funkce.

Syntaxe

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

Parametry

function
Funkce, která se má volat, když je volána čistá virtuální funkce. _purecall_handler Funkce musí mít návratový typ void.

Vrácená hodnota

_purecall_handlerPředchozí . Vrátí nullptr , pokud nebyla žádná předchozí obslužná rutina.

Poznámky

Funkce _get_purecall_handler jsou _set_purecall_handler specifické pro Microsoft a vztahují se pouze na kód jazyka C++.

Volání čistě virtuální funkce je chyba, protože nemá žádnou implementaci. Kompilátor ve výchozím nastavení generuje kód pro vyvolání funkce obslužné rutiny chyby, pokud je volána čistě virtuální funkce, která program ukončí. Můžete nainstalovat vlastní funkci obslužné rutiny chyb pro čistě virtuální volání funkcí, abyste je zachytili pro účely ladění nebo generování sestav. Pokud chcete použít vlastní obslužnou rutinu chyby, vytvořte funkci s _purecall_handler podpisem a pak ji použijte _set_purecall_handler k tomu, aby byla aktuální obslužná rutina.

Vzhledem k tomu, že pro každý proces existuje pouze jeden _purecall_handler , jakmile ho zavoláte _set_purecall_handler , okamžitě ovlivní všechna vlákna. Poslední volající na libovolném vlákně nastaví obslužnou rutinu.

Chcete-li obnovit výchozí chování, zavolejte _set_purecall_handler pomocí argumentu nullptr .

Požadavky

Rutina Požadovaný hlavičkový soubor
_get_purecall_handler, _set_purecall_handler <cstdlib> nebo <stdlib.h>

Informace o kompatibilitě najdete v tématu Kompatibilita.

Příklad

// _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.

Viz také

Zpracování chyb
_purecall