when I try to create a cv::Mat and release it afterwards (code below), I still have (according to valgrind) a memory leak by about 1 Byte per Pixel.
Does anyone know how to free the memory of an cv::Mat properly?
Thanks for ansers :)
Code:
int main(int argc, char** argv)
{
cv::Mat* matrx = new cv::Mat(1000,1000,CV_8UC1,0.);
matrx->release();
delete matrx;
return 0;
}
Valgrind:
[...]
==29420== 1,000,028 bytes in 1 blocks are definitely lost in loss record 372 of 372
==29420== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==29420== by 0x5438877: cv::fastMalloc(unsigned long) (in /usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4.8)
==29420== by 0x536FE2A: cv::Mat::create(int, int const*, int) (in /usr/lib/x86_64-linux-gnu/libopencv_core.so.2.4.8)
==29420== by 0x426FB5: cv::Mat::create(int, int, int) (mat.inl.hpp:663)
==29420== by 0x426ECD: cv::Mat::Mat(int, int, int, cv::Scalar_<double> const&) (mat.inl.hpp:347)
==29420== by 0x425A09: main (main.cpp:18)
==29420==
==29420== LEAK SUMMARY:
==29420== definitely lost: 1,000,028 bytes in 1 blocks
==29420== indirectly lost: 0 bytes in 0 blocks
==29420== possibly lost: 5,072 bytes in 95 blocks
==29420== still reachable: 304,758 bytes in 1,348 blocks
==29420== suppressed: 0 bytes in 0 blocks
[...]
The feedback from opencv github seems clear: you compiled with OpenCV 3.x but use OpenCV 2.4.8 at runtime. Since they are not binary compatible, it does not free properly the cv::Mat
. Let export your LD_LIBRARY_PATH
to the OCV_DIST/lib
of OpenCV 3.x used to compile.
Note that if you delete
the pointer you don't even need to release()
before.
Quoted the following from the documentation page: (http://docs.opencv.org/2.4.9/modules/core/doc/basic_structures.html#mat-release):
void Mat::release() The method decrements the reference counter associated with the matrix data. When the reference counter reaches 0, the matrix data is deallocated and the data and the reference counter pointers are set to NULL’s.
The above means that when you do "delete matrx;" you are trying to delete a memory zone that already points to NULL, which generates a run-time error.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With