_get_purecall_handler
, _set_purecall_handler
Pobiera lub ustawia procedurę obsługi błędów dla czystego wywołania funkcji wirtualnej.
Składnia
typedef void (__cdecl* _purecall_handler)(void);
_purecall_handler __cdecl _get_purecall_handler(void);
_purecall_handler __cdecl _set_purecall_handler(
_purecall_handler function
);
Parametry
function
Funkcja, która ma być wywoływana, gdy wywoływana jest czysta funkcja wirtualna. _purecall_handler
Funkcja musi mieć typ zwracany void.
Wartość zwracana
Poprzedni _purecall_handler
element . Zwraca wartość nullptr
, jeśli nie było poprzedniej procedury obsługi.
Uwagi
Funkcje _get_purecall_handler
i _set_purecall_handler
są specyficzne dla firmy Microsoft i mają zastosowanie tylko do kodu C++.
Wywołanie czystej funkcji wirtualnej jest błędem, ponieważ nie ma implementacji. Domyślnie kompilator generuje kod w celu wywołania funkcji obsługi błędów, gdy wywoływana jest czysta funkcja wirtualna, która kończy program. Możesz zainstalować własną funkcję obsługi błędów dla czystych wywołań funkcji wirtualnych, aby przechwycić je na potrzeby debugowania lub raportowania. Aby użyć własnej procedury obsługi błędów, utwórz funkcję, która ma _purecall_handler
podpis, a następnie użyj polecenia _set_purecall_handler
, aby utworzyć bieżącą procedurę obsługi.
Ponieważ istnieje tylko jeden _purecall_handler
dla każdego procesu, wywołanie _set_purecall_handler
go natychmiast wpływa na wszystkie wątki. Ostatni obiekt wywołujący w każdym wątku ustawia procedurę obsługi.
Aby przywrócić domyślne zachowanie, wywołaj _set_purecall_handler
metodę przy użyciu argumentu nullptr
.
Wymagania
Procedura | Wymagany nagłówek |
---|---|
_get_purecall_handler , _set_purecall_handler |
<cstdlib> lub <stdlib.h> |
Aby uzyskać informacje o zgodności, zobacz Zgodność.
Przykład
// _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.