// Common/NewHandler.h | |
#ifndef __COMMON_NEW_HANDLER_H | |
#define __COMMON_NEW_HANDLER_H | |
/* | |
NewHandler.h and NewHandler.cpp allows to solve problem with compilers that | |
don't throw exception in operator new(). | |
This file must be included before any code that uses operators new() or delete() | |
and you must compile and link "NewHandler.cpp", if you use some old MSVC compiler. | |
The operator new() in some MSVC versions doesn't throw exception std::bad_alloc. | |
MSVC 6.0 (_MSC_VER == 1200) doesn't throw exception. | |
The code produced by some another MSVC compilers also can be linked | |
to library that doesn't throw exception. | |
We suppose that code compiled with VS2015+ (_MSC_VER >= 1900) throws exception std::bad_alloc. | |
For older _MSC_VER versions we redefine operator new() and operator delete(). | |
Our version of operator new() throws CNewException() exception on failure. | |
It's still allowed to use redefined version of operator new() from "NewHandler.cpp" | |
with any compiler. 7-Zip's code can work with std::bad_alloc and CNewException() exceptions. | |
But if you use some additional code (outside of 7-Zip's code), you must check | |
that redefined version of operator new() is not problem for your code. | |
*/ | |
#include <stddef.h> | |
#ifdef _WIN32 | |
// We can compile my_new and my_delete with _fastcall | |
/* | |
void * my_new(size_t size); | |
void my_delete(void *p) throw(); | |
// void * my_Realloc(void *p, size_t newSize, size_t oldSize); | |
*/ | |
#endif | |
#if defined(_MSC_VER) && (_MSC_VER < 1900) | |
// If you want to use default operator new(), you can disable the following line | |
#define _7ZIP_REDEFINE_OPERATOR_NEW | |
#endif | |
#ifdef _7ZIP_REDEFINE_OPERATOR_NEW | |
// std::bad_alloc can require additional DLL dependency. | |
// So we don't define CNewException as std::bad_alloc here. | |
class CNewException {}; | |
void * | |
#ifdef _MSC_VER | |
__cdecl | |
#endif | |
operator new(size_t size); | |
void | |
#ifdef _MSC_VER | |
__cdecl | |
#endif | |
operator delete(void *p) throw(); | |
#else | |
#include <new> | |
#define CNewException std::bad_alloc | |
#endif | |
/* | |
#ifdef _WIN32 | |
void * | |
#ifdef _MSC_VER | |
__cdecl | |
#endif | |
operator new[](size_t size); | |
void | |
#ifdef _MSC_VER | |
__cdecl | |
#endif | |
operator delete[](void *p) throw(); | |
#endif | |
*/ | |
#endif |