| #include "main.h" |
| |
| #include <exception> // 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<Foo, Dynamic, Dynamic> MatrixX; |
| typedef Matrix<Foo, Dynamic, 1> VectorX; |
| |
| 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 = rows*cols; |
| { |
| MatrixX r(rows, cols); |
| Foo::object_limit = r.size()+internal::random<Index>(0, rows*cols - 2); |
| std::cout << "object_limit =" << Foo::object_limit << std::endl; |
| #ifdef EIGEN_EXCEPTIONS |
| try |
| { |
| #endif |
| if(internal::random<bool>()) { |
| 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"; |
| } |