80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #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";
 | |
| }
 | 
