c++ - opencv::Mat 是什么类型的对象?它是 shared_ptr 还是 auto_ptr ?它是一个指针吗?

标签 c++ opencv boost stl smart-pointers

我用的是OpenCv,我用的代码类似下面的代码:

Mat Create()
{ 
     Mat myMat(10, 10, CV8U_C1);    
     int x=myMat.Rows; // I am accessing Mat like an object not a pointer. 
     Return myMat;
 }

 Main()
 {
       Mat aMat=Create(); // created inside this function
       int x=aMat.Rows; // accessing it using . notation
       // do some work
       return;   //I did not delete Mat, as it would release its memory.
 }

如何在我的 C++ 代码中创建相似的对象?

我正在使用 STL,但如果需要我也可以使用 Boost。

最佳答案

首先,std::vectorMat 和其他数据结构都具有析构函数,可以在需要时释放底层内存缓冲区。这意味着析构函数并不总是像 Mat 那样释放缓冲区。他们考虑了可能的数据共享。析构函数递减与矩阵数据缓冲区关联的引用计数器。缓冲区被释放当且仅当引用计数器达到零。也就是说,当没有其他结构引用同一缓冲区时。同样,当复制 Mat 实例时,并没有真正复制实际数据。相反,引用计数器会增加以记住同一数据的另一个所有者。还有 Mat::clone() 方法可以创建矩阵数据的完整拷贝。

关于c++ - opencv::Mat 是什么类型的对象?它是 shared_ptr 还是 auto_ptr ?它是一个指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17193512/

相关文章:

c++ - 使用 BOOST_PP_SEQ_FOREACH_R 递归处理枚举

c++ - 最烦人的解析 C++11

Python opencv drawContours 不显示任何内容

python - cv2.waitkey(1) 未在 opencv python 中运行

visual-studio - Visual Studio 2012 上 OpenCV 2.4.2 中的 MSER 示例

c++ - IplImage 结构的 boost 序列化问题

c++ - 在栈尾分配的递归函数

c++ - 为什么我收到重新定义错误C++?

c++ - 我的应用程序创建的 Windows CE/嵌入式 C++ 非 volatile 文件在重新启动时被删除

c++ - 将 Boost 库安装到 ~ (home) 中的自定义目录