如何通过引用返回对象?

时间:2013-07-11 06:12:14

标签: c++ opencv memory-management

我正在阅读一篇OpenCV教程,它说下面关于OpenCV的图像持有者类(cv :: Mat):

The cv::Mat class implements reference counting and shallow copy such that when an image 
is assigned to another one, the image data (that is the pixels) is not copied, and both images 
will point to the same memory block. This also applies to images passed by value or returned 
by value. A reference count is kept such that the memory will be released only when all of the 
references to the image will be destructed. 

我特别感兴趣的是This also applies to images passed by value or returned.部分在通过值传递时如何指向相同的内存块?我觉得这与重载=运算符有关。但它表示即使返回一个图像,它也只会返回指向同一个内存块的图像,而不会创建一个新的图像。我不明白他们是如何实现的。

但这就是我所理解的:

假设按值传递并返回图像使新图像共享相同的内存块,则实现引用计数是有意义的。

但是你能解释一下如何共享内存块,即使是按值返回或传递一个对象吗?

4 个答案:

答案 0 :(得分:2)

这相对简单:在类的构造函数中,您可以分配内存,例如:使用new。如果你制作一个对象的副本,你不是每次都分配新的内存,而是只复制指向原始内存块的指针,同时递增一个也存储在内存中的引用计数器,使得每个副本都是对象可以访问它。如果引用计数降至零,则销毁对象将减少引用计数并仅释放分配的内存。

您需要自定义复制构造函数和赋值运算符。

这基本上是共享指针的工作方式。

答案 1 :(得分:1)

它可以像cv::Mat一样简单,它具有指向动态分配的内存块的共享指针。复制Mat实例时,复制共享指针(递增引用计数),而不是它指向的资源。

答案 2 :(得分:1)

多个cv::Mat可以共享相同的数据数组但具有不同的标头。有一个计数器可以计算使用此数据阵列的垫数。当计数器到达0时,数据数组被释放。或者它会一直存在。此外,CvMatMatIplImage可以毫无问题地共享相同的数据数组。它们之间的唯一区别是标题。

答案 3 :(得分:1)

  

传递时如何指向相同的内存块   按值?

cv :: Mat结构实际上管理动态分配的内存位置。它只是一个指向此位置的指针,并携带有关矩阵属性的信息。按值传递此变量时,只需复制此指针,不会复制动态内存。为了深度复制cv :: Mat的所有元素,有一个名为copyTo()的方法。