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.
|
|
#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); } }
|