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