summaryrefslogtreecommitdiff
path: root/shared/debug_new.h
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:08:06 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:08:06 +0200
commitfbe76102e941b9f1edaf236788e42678f05fdf9a (patch)
treef5f538316019fa89be8dc478103490c3a826f3ac /shared/debug_new.h
parent3.8 (diff)
downloadFreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.tar.gz
FreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.tar.bz2
FreeFileSync-fbe76102e941b9f1edaf236788e42678f05fdf9a.zip
3.9
Diffstat (limited to 'shared/debug_new.h')
-rw-r--r--shared/debug_new.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/shared/debug_new.h b/shared/debug_new.h
new file mode 100644
index 00000000..c9c3dbf6
--- /dev/null
+++ b/shared/debug_new.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 <string>
+#include <sstream>
+#include <cstdlib> //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\debug_new.h
+ For Minidumps:
+ - Compile "debug_new.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 <class T>
+ 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
+
bgstack15