summaryrefslogtreecommitdiff
path: root/zen/debug_new.h
diff options
context:
space:
mode:
Diffstat (limited to 'zen/debug_new.h')
-rw-r--r--zen/debug_new.h96
1 files changed, 96 insertions, 0 deletions
diff --git a/zen/debug_new.h b/zen/debug_new.h
new file mode 100644
index 00000000..2976d3d7
--- /dev/null
+++ b/zen/debug_new.h
@@ -0,0 +1,96 @@
+// **************************************************************************
+// * 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-2011 ZenJu (zhnmju123 AT gmx.de) *
+// **************************************************************************
+
+#ifndef DEBUGNEW_H_INCLUDED
+#define DEBUGNEW_H_INCLUDED
+
+#include <string>
+#include <sstream>
+#include <cstdlib> //malloc(), free()
+
+#ifndef _MSC_VER
+#error currently for use with MSC only
+#endif
+
+/*overwrite "operator new" to get more detailed error messages on bad_alloc, detect memory leaks and write memory dumps
+Usage:
+- Include everywhere before any other file: $(ProjectDir)\shared\debug_new.h
+For Minidumps:
+- Compile "debug_new.cpp"
+- Compile with debugging symbols and optimization deactivated
+*/
+
+namespace mem_check
+{
+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::ostringstream ss;
+ ss << number;
+ return ss.str();
+ }
+
+ std::string errorMsg;
+};
+
+#ifdef _MSC_VER
+void writeMinidump();
+#endif
+}
+
+inline
+void* operator new(size_t size)
+{
+ void* newMem = ::malloc(size);
+ if (!newMem)
+ {
+#ifdef _MSC_VER
+ mem_check::writeMinidump();
+#endif
+ throw mem_check::BadAllocDetailed(size);
+ }
+ return newMem;
+}
+
+
+inline
+void operator delete(void* ptr)
+{
+ ::free(ptr);
+}
+
+
+inline
+void* operator new[](size_t size)
+{
+ return operator new(size);
+}
+
+
+inline
+void operator delete[](void* ptr)
+{
+ operator delete(ptr);
+}
+
+#endif // DEBUGNEW_H_INCLUDED
bgstack15