diff options
Diffstat (limited to 'test/ctorleak.cpp')
-rw-r--r-- | test/ctorleak.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/test/ctorleak.cpp b/test/ctorleak.cpp new file mode 100644 index 000000000..145d91be4 --- /dev/null +++ b/test/ctorleak.cpp @@ -0,0 +1,51 @@ +#include "main.h" + +#include <exception> // std::exception + +struct Foo +{ + static unsigned object_count; + static unsigned object_limit; + int dummy; + + Foo() + { +#ifdef EIGEN_EXCEPTIONS + // TODO: Is this the correct way to handle this? + if (Foo::object_count > Foo::object_limit) { throw Foo::Fail(); } +#endif + ++Foo::object_count; + } + + ~Foo() + { + --Foo::object_count; + } + + class Fail : public std::exception {}; +}; + +unsigned Foo::object_count = 0; +unsigned Foo::object_limit = 0; + + +void test_ctorleak() +{ + typedef DenseIndex Index; + Foo::object_count = 0; + for(int i = 0; i < g_repeat; i++) { + Index rows = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE), cols = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE); + Foo::object_limit = internal::random(0, rows*cols - 2); +#ifdef EIGEN_EXCEPTIONS + try + { +#endif + Matrix<Foo, Dynamic, Dynamic> m(rows, cols); +#ifdef EIGEN_EXCEPTIONS + VERIFY(false); // not reached if exceptions are enabled + } + catch (const Foo::Fail&) { /* ignore */ } +#endif + } + VERIFY_IS_EQUAL(static_cast<unsigned>(0), Foo::object_count); +} |