aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/SPQRSupport
diff options
context:
space:
mode:
authorGravatar Desire NUENTSA <desire.nuentsa_wakam@inria.fr>2013-09-24 15:56:56 +0200
committerGravatar Desire NUENTSA <desire.nuentsa_wakam@inria.fr>2013-09-24 15:56:56 +0200
commitfe19f972e19b73a98c6e546a1521d47348128bac (patch)
tree352cb1f1fa857b03e37d9aeb55bcaf94ba4dcbc0 /Eigen/src/SPQRSupport
parent00dc45d0f912407366b20e132df76cffbbf22449 (diff)
Fix leaked memory for successive calls to SPQR
Diffstat (limited to 'Eigen/src/SPQRSupport')
-rw-r--r--Eigen/src/SPQRSupport/SuiteSparseQRSupport.h16
1 files changed, 12 insertions, 4 deletions
diff --git a/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h b/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h
index aa41f434c..e1a320446 100644
--- a/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h
+++ b/Eigen/src/SPQRSupport/SuiteSparseQRSupport.h
@@ -64,7 +64,8 @@ class SPQR
typedef PermutationMatrix<Dynamic, Dynamic> PermutationType;
public:
SPQR()
- : m_ordering(SPQR_ORDERING_DEFAULT),
+ : m_isInitialized(false),
+ m_ordering(SPQR_ORDERING_DEFAULT),
m_allow_tol(SPQR_DEFAULT_TOL),
m_tolerance (NumTraits<Scalar>::epsilon())
{
@@ -72,7 +73,8 @@ class SPQR
}
SPQR(const _MatrixType& matrix)
- : m_ordering(SPQR_ORDERING_DEFAULT),
+ : m_isInitialized(false),
+ m_ordering(SPQR_ORDERING_DEFAULT),
m_allow_tol(SPQR_DEFAULT_TOL),
m_tolerance (NumTraits<Scalar>::epsilon())
{
@@ -82,16 +84,22 @@ class SPQR
~SPQR()
{
- // Calls SuiteSparseQR_free()
+ SPQR_free();
+ cholmod_l_finish(&m_cc);
+ }
+ void SPQR_free()
+ {
cholmod_l_free_sparse(&m_H, &m_cc);
cholmod_l_free_sparse(&m_cR, &m_cc);
cholmod_l_free_dense(&m_HTau, &m_cc);
std::free(m_E);
std::free(m_HPinv);
- cholmod_l_finish(&m_cc);
}
+
void compute(const _MatrixType& matrix)
{
+ if(m_isInitialized) SPQR_free();
+
MatrixType mat(matrix);
cholmod_sparse A;
A = viewAsCholmod(mat);