From 37d4e24806fb885f2fc8da44dc8421b61495e87d Mon Sep 17 00:00:00 2001 From: Igor Wodiany Date: Wed, 4 Oct 2017 22:54:40 +0100 Subject: [PATCH] Fix a memory leak in the Mat copying constructor Exception may be rasied inside the body of a copying constructor after refcount has been increased, and beacause in the case of the exception destrcutor is never called what causes memory leak. This commit adds a workaround that calls the release() function before the exception is thrown outside the contructor. --- modules/core/src/matrix.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/modules/core/src/matrix.cpp b/modules/core/src/matrix.cpp index aee377f665..6ce4ae89b4 100644 --- a/modules/core/src/matrix.cpp +++ b/modules/core/src/matrix.cpp @@ -279,21 +279,31 @@ Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange) : size(&r } *this = m; - if( _rowRange != Range::all() && _rowRange != Range(0,rows) ) + try { - CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows ); - rows = _rowRange.size(); - data += step*_rowRange.start; - flags |= SUBMATRIX_FLAG; - } + if( _rowRange != Range::all() && _rowRange != Range(0,rows) ) + { + CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end + && _rowRange.end <= m.rows ); + rows = _rowRange.size(); + data += step*_rowRange.start; + flags |= SUBMATRIX_FLAG; + } - if( _colRange != Range::all() && _colRange != Range(0,cols) ) + if( _colRange != Range::all() && _colRange != Range(0,cols) ) + { + CV_Assert( 0 <= _colRange.start && _colRange.start <= _colRange.end + && _colRange.end <= m.cols ); + cols = _colRange.size(); + data += _colRange.start*elemSize(); + flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1; + flags |= SUBMATRIX_FLAG; + } + } + catch(...) { - CV_Assert( 0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols ); - cols = _colRange.size(); - data += _colRange.start*elemSize(); - flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1; - flags |= SUBMATRIX_FLAG; + release(); + throw; } if( rows == 1 )