diff --git a/docs/configuration.md b/docs/configuration.md index 4cedc72cab..c1616db639 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -76,6 +76,7 @@ All C++11 support can be disabled with `CATCH_CONFIG_NO_CPP11` CATCH_CONFIG_WINDOWS_SEH // Enable SEH handling on Windows CATCH_CONFIG_FAST_COMPILE // Sacrifices some (extremely minor) features for compilation speed CATCH_CONFIG_POSIX_SIGNALS // Enable handling POSIX signals + CATCH_CONFIG_WINDOWS_CRTDBG // Enable leak checking using Windows's CRT Debug Heap Currently Catch enables `CATCH_CONFIG_WINDOWS_SEH` only when compiled with MSVC, because some versions of MinGW do not have the necessary Win32 API support. @@ -83,6 +84,8 @@ At this moment, `CATCH_CONFIG_FAST_COMPILE` changes only the behaviour of the `- `CATCH_CONFIG_POSIX_SIGNALS` is on by default, except when Catch is compiled under `Cygwin`, where it is disabled by default (but can be force-enabled by defining `CATCH_CONFIG_POSIX_SIGNALS`). +`CATCH_CONFIG_WINDOWS_CRTDBG` is off by default. If enabled, it sets Windows's CRT to check for memory leaks, and displays them after the tests finish running. + Just as with the C++11 conformance toggles, these toggles can be disabled by using `_NO_` form of the toggle, e.g. `CATCH_CONFIG_NO_WINDOWS_SEH`. # Windows header clutter diff --git a/include/internal/catch_default_main.hpp b/include/internal/catch_default_main.hpp index 12ca902477..2a8b226fd2 100644 --- a/include/internal/catch_default_main.hpp +++ b/include/internal/catch_default_main.hpp @@ -10,8 +10,22 @@ #ifndef __OBJC__ +#ifdef CATCH_CONFIG_WINDOWS_CRTDBG +#include +#endif + // Standard C/C++ main entry point int main (int argc, char * argv[]) { +#ifdef CATCH_CONFIG_WINDOWS_CRTDBG + int flag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); + flag |= _CRTDBG_LEAK_CHECK_DF; + flag |= _CRTDBG_ALLOC_MEM_DF; + _CrtSetDbgFlag(flag); + _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE); + _CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDERR); + // Change this to leaking allocation's number to break there + _CrtSetBreakAlloc(-1); +#endif int result = Catch::Session().run( argc, argv ); return ( result < 0xff ? result : 0xff ); }