_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_handler
Př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.