提交 b638aa74 编写于 作者: I Igor Wodiany 提交者: Alexander Alekhin

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.
上级 d25ee8a2
...@@ -484,9 +484,12 @@ Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange) ...@@ -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) ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册