Redigera

Dela via


_get_purecall_handler, _set_purecall_handler

Gets or sets the error handler for a pure virtual function call.

Syntax

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

Parameters

function
The function to be called when a pure virtual function is called. A _purecall_handler function must have a void return type.

Return value

The previous _purecall_handler. Returns nullptr if there was no previous handler.

Remarks

The _get_purecall_handler and _set_purecall_handler functions are Microsoft-specific and apply only to C++ code.

A call to a pure virtual function is an error because it has no implementation. By default, the compiler generates code to invoke an error handler function when a pure virtual function is called, which terminates the program. You can install your own error handler function for pure virtual function calls, to catch them for debugging or reporting purposes. To use your own error handler, create a function that has the _purecall_handler signature, then use _set_purecall_handler to make it the current handler.

Because there's only one _purecall_handler for each process, when you call _set_purecall_handler it immediately impacts all threads. The last caller on any thread sets the handler.

To restore the default behavior, call _set_purecall_handler by using a nullptr argument.

Requirements

Routine Required header
_get_purecall_handler, _set_purecall_handler <cstdlib> or <stdlib.h>

For compatibility information, see Compatibility.

Example

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

See also

Error handling
_purecall