summaryrefslogtreecommitdiff
path: root/shared/debugNew.h
diff options
context:
space:
mode:
Diffstat (limited to 'shared/debugNew.h')
-rw-r--r--shared/debugNew.h95
1 files changed, 95 insertions, 0 deletions
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 <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\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 <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