Поделиться через


_get_purecall_handler, _set_purecall_handler

Получает или задает обработчик ошибок для вызова чистой виртуальной функции.

Синтаксис

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

Параметры

function
Эту функцию необходимо вызывать при вызове чистой виртуальной функции. Функция _purecall_handler должна иметь тип возвращаемого значения void.

Возвращаемое значение

Предыдущая функция _purecall_handler. Возвращает nullptr, если не было предыдущего обработчика.

Замечания

Функции _get_purecall_handler и _set_purecall_handler предназначены специально для систем Майкрософт и применяются только к коду C++.

Вызов чистой виртуальной функции является ошибкой, так как она не имеет реализации. По умолчанию компилятор создает код для вызова функции обработчика ошибок при вызове чистой виртуальной функции, который завершает программу. Можно установить собственный обработчик ошибок для вызовов чисто виртуальных функций, который будет перехватывать их в целях отладки или ведения отчетности. Чтобы использовать собственный обработчик ошибок, создайте функцию с сигнатурой _purecall_handler, а затем с помощью _set_purecall_handler установите ее в качестве текущего обработчика.

Так как для каждого процесса существует только один _purecall_handler процесс, при вызове _set_purecall_handler его немедленно влияет на все потоки. Последний вызывающий элемент в любом потоке задает обработчик.

Чтобы восстановить поведение по умолчанию, вызовите функцию _set_purecall_handler с аргументом nullptr.

Требования

Маршрут Обязательный заголовок
_get_purecall_handler, _set_purecall_handler <cstdlib или <stdlib.h>>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

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

См. также

Обработка ошибок
_purecall