You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.7 KiB
69 lines
1.7 KiB
#include "main.h" |
|
|
|
#include <exception> // std::exception |
|
|
|
struct Foo |
|
{ |
|
static Index object_count; |
|
static Index object_limit; |
|
int dummy; |
|
|
|
Foo() |
|
{ |
|
#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 |
|
|
|
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); // 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); |
|
} |
|
}
|
|
|