我正在阅读 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.
我特别感兴趣的部分是这也适用于按值传递或返回的图像。
按值传递时如何指向同一个内存块?我觉得这与重载 =
运算符有关。但它说即使返回图像,它也只会返回指向同一内存块的图像并且不会创建新图像。我不明白他们是如何实现的。
但这是我所理解的:
鉴于按值传递和返回图像使新图像共享同一内存块,因此实现引用计数是有意义的。
但是您能解释一下内存块是如何共享的吗,即使是在返回或按值传递对象时也是如此?
最佳答案
这相对容易:在类的构造函数中,您分配内存,例如使用 new
。如果你复制一个对象,你不会每次都分配新的内存,而是只复制指向原始内存块的指针,同时增加一个也存储在内存中某处的引用计数器,这样每个拷贝对象可以访问它。销毁对象会减少引用计数,并且只有在引用计数降为零时才会释放分配的内存。
您只需要自定义复制构造函数和赋值运算符即可。
这基本上就是共享指针的工作方式。
关于c++ - 如何通过引用返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17586252/