Source code

Revision control

Copy as Markdown

Other Tools

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