c++ - 如何通过引用返回对象?

标签 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. 

我特别感兴趣的部分是这也适用于按值传递或返回的图像。按值传递时如何指向同一个内存块?我觉得这与重载 = 运算符有关。但它说即使返回图像,它也只会返回指向同一内存块的图像并且不会创建新图像。我不明白他们是如何实现的。

但这是我所理解的:

鉴于按值传递和返回图像使新图像共享同一内存块,因此实现引用计数是有意义的。

但是您能解释一下内存块是如何共享的吗,即使是在返回或按值传递对象时也是如此?

最佳答案

这相对容易:在类的构造函数中,您分配内存,例如使用 new。如果你复制一个对象,你不会每次都分配新的内存,而是只复制指向原始内存块的指针,同时增加一个也存储在内存中某处的引用计数器,这样每个拷贝对象可以访问它。销毁对象会减少引用计数,并且只有在引用计数降为零时才会释放分配的内存。

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

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

关于c++ - 如何通过引用返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17586252/

相关文章:

C++ 类委托(delegate)构造函数问题

opencv - OpenCV中两个矩阵的广义特征值

sql - 执行查询后,SQL Server不释放内存

python - 一旦 python 脚本从终端 (Ctrl-C) 停止,如何释放 Ubuntu 内存?

c++ - 如何在 Clion 和 CMake 中添加 allegro 库?

c++ - 使用 WMI 的电池 FullChargeCapacity 返回 0

c++ - 在 c++ 中执行此操作的最快方法是什么(使用 OpenMP)

c++ - 在不复制数据的情况下更改 opencv mat 中的列顺序

ios - NS自动释放池。什么时候适合创建一个新的自动释放池?

c++ - 使用 operator[] 和 operator=