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.
pull/9792/head
Igor Wodiany 8 years ago committed by Alexander Alekhin
parent d25ee8a273
commit b638aa74d7
  1. 14
      modules/core/src/matrix.cpp

@ -484,9 +484,12 @@ Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange)
} }
*this = m; *this = m;
try
{
if( _rowRange != Range::all() && _rowRange != Range(0,rows) ) if( _rowRange != Range::all() && _rowRange != Range(0,rows) )
{ {
CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows ); CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end
&& _rowRange.end <= m.rows );
rows = _rowRange.size(); rows = _rowRange.size();
data += step*_rowRange.start; data += step*_rowRange.start;
flags |= SUBMATRIX_FLAG; flags |= SUBMATRIX_FLAG;
@ -494,12 +497,19 @@ Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange)
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 ); CV_Assert( 0 <= _colRange.start && _colRange.start <= _colRange.end
&& _colRange.end <= m.cols );
cols = _colRange.size(); cols = _colRange.size();
data += _colRange.start*elemSize(); data += _colRange.start*elemSize();
flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1; flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1;
flags |= SUBMATRIX_FLAG; flags |= SUBMATRIX_FLAG;
} }
}
catch(...)
{
release();
throw;
}
if( rows == 1 ) if( rows == 1 )
flags |= CONTINUOUS_FLAG; flags |= CONTINUOUS_FLAG;

Loading…
Cancel
Save