99 lines
2.6 KiB
C++
99 lines
2.6 KiB
C++
// Common/NewHandler.h
|
|
|
|
#ifndef ZIP7_INC_COMMON_NEW_HANDLER_H
|
|
#define ZIP7_INC_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.
|
|
|
|
DOCs:
|
|
Since ISO C++98, operator new throws std::bad_alloc when memory allocation fails.
|
|
MSVC 6.0 returned a null pointer on an allocation failure.
|
|
Beginning in VS2002, operator new conforms to the standard and throws on failure.
|
|
|
|
By default, the compiler also generates defensive null checks to prevent
|
|
these older-style allocators from causing an immediate crash on failure.
|
|
The /Zc:throwingNew option tells the compiler to leave out these null checks,
|
|
on the assumption that all linked memory allocators conform to the standard.
|
|
|
|
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 < 1600)
|
|
// If you want to use default operator new(), you can disable the following line
|
|
#define Z7_REDEFINE_OPERATOR_NEW
|
|
#endif
|
|
|
|
|
|
#ifdef Z7_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
|