Udostępnij za pośrednictwem


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

Zobacz też

Obsługa błędów
_purecall