Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

What's the correct way to release cv::Mat?

Hi there.

I'm not sure if I'm right, please correct me if I'm missing.

A cv::Mat struct contains the field 'refcount', that can point at value 1 or greater. This is the number of references to the cv::Mat on memory from different elements (for example, a cv::vector<cv::mat> element>). If the number is greater than 1, applying the release method onto the cv::Mat, it will decrease the refcount variable (pointing to the last number minus one). If refcount value equals 1 when calling release() method, it will deallocate the image from memory, so this is the unique value that allow us to free memory.

That was the theory. Now, the practice.

My problem comes when I try to do the next:

if(*output_image.refcount > 1)
      *output_image.refcount = 1;
output_image.release();

In this code I'm trying to force the cv::Mat for deallocating memory (I doesn't care if there's still any reference to the cv::Mat, because I'm not going to use them). My problem comes when I reach this block with refcount = 0. Apparently there is no problem, but the line

if(*output_image.refcount > 1)

makes a call to release() method. I don't know why exactly, but it does.

Entering on release() method, it tries to deallocate memory (it enters on the first if):

inline void Mat::release()
{
    if( refcount && CV_XADD(refcount, -1) == 1 )
        deallocate();
    data = datastart = dataend = datalimit = 0;
    size.p[0] = 0;
    refcount = 0;
}

And obviously it throws a memory violation exception. What's the problem on my code? How can I avoid this exception? What means refcount = 0?

I'm checking refcount on my code in order to avoid the exception c0000005 on opencv_core249.dll. This exception appears when a strange value is added to refcount. Or that's what I think, maybe I'm wrong.

Thank you for your help.

My best regards,

Bivalvo.