|
|
#include "main.h" |
|
|
|
|
|
#include <exception> |
|
|
|
|
|
struct Foo |
|
|
{ |
|
|
static Index object_count; |
|
|
static Index object_limit; |
|
|
int dummy; |
|
|
|
|
|
Foo() |
|
|
{ |
|
|
#ifdef EIGEN_EXCEPTIONS |
|
|
|
|
|
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 |
|
|
|
|
|
void 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 = internal::random<Index>(0, rows*cols - 2); |
|
|
std::cout << "object_limit =" << Foo::object_limit << std::endl; |
|
|
#ifdef EIGEN_EXCEPTIONS |
|
|
try |
|
|
{ |
|
|
#endif |
|
|
std::cout << "\nMatrixX m(" << rows << ", " << cols << ");\n"; |
|
|
MatrixX m(rows, cols); |
|
|
#ifdef EIGEN_EXCEPTIONS |
|
|
VERIFY(false); |
|
|
} |
|
|
catch (const Foo::Fail&) { } |
|
|
#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); |
|
|
} |
|
|
} |
|
|
|