#include "main.h" #include // std::exception struct Foo { static Index object_count; static Index object_limit; int dummy; Foo() : dummy(0) { #ifdef EIGEN_EXCEPTIONS // TODO: Is this the correct way to handle this? if (Foo::object_count > Foo::object_limit) { std::cout << "\nThrow!\n"; throw Foo::Fail(); } #endif std::cout << '+'; ++Foo::object_count; } ~Foo() { std::cout << '-'; --Foo::object_count; } class Fail : public std::exception {}; }; Index Foo::object_count = 0; Index Foo::object_limit = 0; #undef EIGEN_TEST_MAX_SIZE #define EIGEN_TEST_MAX_SIZE 3 EIGEN_DECLARE_TEST(ctorleak) { typedef Matrix MatrixX; typedef Matrix VectorX; Foo::object_count = 0; for (int i = 0; i < g_repeat; i++) { Index rows = internal::random(2, EIGEN_TEST_MAX_SIZE), cols = internal::random(2, EIGEN_TEST_MAX_SIZE); Foo::object_limit = rows * cols; { MatrixX r(rows, cols); Foo::object_limit = r.size() + internal::random(0, rows * cols - 2); std::cout << "object_limit =" << Foo::object_limit << std::endl; #ifdef EIGEN_EXCEPTIONS try { #endif if (internal::random()) { std::cout << "\nMatrixX m(" << rows << ", " << cols << ");\n"; MatrixX m(rows, cols); } else { std::cout << "\nMatrixX m(r);\n"; MatrixX m(r); } #ifdef EIGEN_EXCEPTIONS VERIFY(false); // not reached if exceptions are enabled } catch (const Foo::Fail&) { /* ignore */ } #endif } VERIFY_IS_EQUAL(Index(0), Foo::object_count); { Foo::object_limit = (rows + 1) * (cols + 1); MatrixX A(rows, cols); VERIFY_IS_EQUAL(Foo::object_count, rows * cols); VectorX v = A.row(0); VERIFY_IS_EQUAL(Foo::object_count, (rows + 1) * cols); v = A.col(0); VERIFY_IS_EQUAL(Foo::object_count, rows * (cols + 1)); } VERIFY_IS_EQUAL(Index(0), Foo::object_count); } std::cout << "\n"; }