From 8318453bf9d4fd50b137ff6c6fc8d1fd22aa6395 Mon Sep 17 00:00:00 2001 From: Daniel Wilhelm Date: Fri, 18 Apr 2014 17:07:15 +0200 Subject: 3.7 --- shared/debugNew.h | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 shared/debugNew.h (limited to 'shared/debugNew.h') diff --git a/shared/debugNew.h b/shared/debugNew.h new file mode 100644 index 00000000..702cf774 --- /dev/null +++ b/shared/debugNew.h @@ -0,0 +1,95 @@ +// ************************************************************************** +// * This file is part of the FreeFileSync project. It is distributed under * +// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * +// * Copyright (C) 2008-2010 ZenJu (zhnmju123 AT gmx.de) * +// ************************************************************************** +// +#ifndef DEBUGNEW_H_INCLUDED +#define DEBUGNEW_H_INCLUDED + +#include +#include +#include //malloc(), free() + + +/*all this header does is to globally overwrite "operator new" to give some more detailed error messages and write memory dumps +Usage: + - Include everywhere before any other file: $(ProjectDir)\shared\debugNew.h + For Minidumps: + - Compile "debugNew.cpp" + - Include library "Dbghelp.lib" + - Compile in Debug build (need Symbols and less restrictive Optimization) +*/ + +class BadAllocDetailed : public std::bad_alloc +{ +public: + explicit BadAllocDetailed(size_t allocSize) + { + errorMsg = "Memory allocation failed: "; + errorMsg += numberToString(allocSize); + } + + ~BadAllocDetailed() throw() {} + + virtual const char* what() const throw() + { + return errorMsg.c_str(); + } + +private: + template + static std::string numberToString(const T& number) //convert number to string the C++ way + { + std::stringstream ss; + ss << number; + return ss.str(); + } + + std::string errorMsg; +}; + +#ifdef _MSC_VER +namespace MemoryDump +{ +void writeMinidump(); +} +#endif + +inline +void* operator new(size_t allocSize) +{ + void* newMem = ::malloc(allocSize); + if (!newMem) + { +#ifdef _MSC_VER + MemoryDump::writeMinidump(); +#endif + throw BadAllocDetailed(allocSize); + } + return newMem; +} + + +inline +void* operator new[](size_t allocSize) +{ + return operator new(allocSize); +} + + +inline +void operator delete(void* memory) +{ + ::free(memory); +} + + +inline +void operator delete[](void* memory) +{ + operator delete(memory); +} + +#endif // DEBUGNEW_H_INCLUDED + -- cgit