文章目录

    • 1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案
  • c++中临时变量不能作为非const的引用参数
    • 2. 动态内存管理类
    • 3. 对象移动与右值引用
    • 4. 移动构造与移动复制运算符

1 .对象移动与右值引用 实际应用过程中遇到的问题及其解决方案

问题描述:

bool CrossCenters(const cv::Mat& image,
cv::Size& image_size);

/home/sun/orthodox_ws/deptrum/src/pipeline/orthodox_impl.cc:195:54: error: cannot bind non-const lvalue reference of type ‘cv::Size& {aka cv::Size_<int>&}’ to an rvalue of type ‘cv::Size {aka cv::Size_<int>}’ir_8bit.size(),~~~~~~~~~~~~^~

加上const

/home/sun/orthodox_ws/deptrum/orthodox/src/utils/loader.cc: In member function ‘bool deptrum::Loader::CrossCenters(const cv::Mat&, std::vector<cv::Mat>&, const Size&, std::vector<std::vector<cv::Point_<float> > >&, std::vector<std::vector<cv::Point3_<float> > >&, std::vector<deptrum::orthodox::CrossCenter>&, std::vector<cv::Mat>&, cv::Mat&, bool)’:
/home/sun/orthodox_ws/deptrum/orthodox/src/utils/loader.cc:70:27: error: passing ‘const Size {aka const cv::Size_<int>}’ as ‘this’ argument discards qualifiers [-fpermissive]image_size = image.size();

bool CrossCenters(const cv::Mat& image, cv::Size& image_size)在接口引用的过程中,如下

  result = CrossCenters(input_gray,input_gray.size())

内部实现:

bool CrossCenters(const cv::Mat& image,cv::Size& image_size) {
。。。。image_list.push_back(image);image_size = image.size();

分析:

通常情况下,函数f(a),a的值会存在一个临时变量中,当把这个临时变量传给f时候,由于 CrossCenters声明中image_size参数是 cv::Size& ,不是常量引用。因为c++编译器的一个关于语义的限制,如果一个参数以非const引用传入,c++编译器就会认为程序员会在函数中修改这个值,并且这个被修改的值在返回后要发挥作用。但是把一个临时变量当作非const引用参数传进来,由于临时变量的特殊性,程序员并不能操作临时变量,而且临时变量随时可能被释放掉,所以一般来说,修改一个临时变量是毫无意义的。据此,c++编译器加入了临时变量不能作为非const引用的这个语义限制。

c++中临时变量不能作为非const的引用参数

解决方法参考:

https://www.cnblogs.com/area-h-p/p/11498481.html

2. 动态内存管理类

3. 对象移动与右值引用

int a;
int b;a = 3;
b = 4;
a = b;
b = a;// 以下写法不合法。
3 = a;
a+b = 4;

在 c 语言中, 确切地说应该是左值表达式,右值表达式:表达式是有值的,值是有类型的,值是动态的,类型是静态的,这是基本的概念 。通常来说有名字的变量就是左值(如上面例子中的 a, b),而由运算操作(加减乘除,函数调用返回值等)所产生的中间结果(没有名字)就是右值,如上的 3 + 4, a + b 等。我们暂且可以认为:左值就是在程序中能够寻值的东西,右值就是没法取到它的地址的东西(不完全准确),但如上概念到了 c++ 中,就变得稍有不同。具体来说,在 c++ 中,每一个表达式都会产生一个左值,或者右值,相应的,该表达式也就被称作“左值表达式", “右值表达式”。对于基本数据类型来说(primitive types),左值右值的概念和 c 没有太多不同,不同的地方在于自定义的类型,而且这种不同比较容易让人混淆:

  1. 对于基础类型,右值是不可被修改的(non-modifiable),也不可被 const, volatile 所修饰(cv-qualitification ignored)

  2. 对于自定义的类型(user-defined types),右值却允许通过它的成员函数进行修改。

对于 1),这和 c 是一致的,2) 却是 C++ 中所独有, 因此,如果你看到 C++ 中如下的写法,千万不要惊讶:

https://www.cnblogs.com/catch/p/5019402.html

https://www.cnblogs.com/catch/p/3500678.html

4. 移动构造与移动复制运算符

【C++】动态内存管理/move/以及移动构造与移动赋值运算符相关推荐

  1. C和C++安全编码笔记:动态内存管理

    4.1 C内存管理: C标准内存管理函数: (1).malloc(size_t size):分配size个字节,并返回一个指向分配的内存的指针.分配的内存未被初始化为一个已知值. (2).aligne ...

  2. 《C++应用程序性能优化::第五章动态内存管理》学习和理解

    <C++应用程序性能优化::第五章动态内存管理>学习和理解 说明:<C++应用程序性能优化> 作者:冯宏华等 2007年版. 2010.8.29 cs_wuyg@126.com ...

  3. LwIP 之五 详解动态内存管理 内存堆(mem.c/h)

    写在前面   目前网上有很多介绍LwIP内存的文章,但是绝大多数都不够详细,甚至很多介绍都是错误的!无论是代码的说明还是给出的图例,都欠佳!下面就从源代码,到图例详细进行说明.   目前,网络上多数文 ...

  4. 动态内存管理:malloc和free以及new和delete的联系与区别

    动态内存管理:malloc和free以及new和delete的联系与区别 文章目录 动态内存管理:malloc和free以及new和delete的联系与区别 一. C/C++中程序内存区域划分: 二. ...

  5. 析构函数和动态内存管理

    析构函数 当类的对象撤销时,析构函数被隐式调用.析构函数不是释放内存,而是释放内存前进行扫尾工作. 对象何时撤销?1,静态分配的,生存期过后撤销.2,动态分配的,delete时撤销. 析构函数的命名 ...

  6. 【带你吃透C++】C++动态内存管理

    C++动态内存管理 前言 1. C/C++内存分布 例题理解 2.C语言中动态内存管理方式( malloc/calloc/realloc和free) 3.C++中动态内存管理方式 new和delete ...

  7. C语言之动态内存管理与动态内存函数

    文章目录 一.为什么存在动态内存分配? 二.动态内存函数的介绍 1.malloc和free 2.calloc函数 3.realloc函数 一.为什么存在动态内存分配? 学习动态内存的管理方法之前,我们 ...

  8. FreeRTOS 之五 动态内存管理(heap_1.c)详解

    写在前面   写这篇文章时,网上已经有了铺天盖地的文章来介绍 FreeRTOS 的动态内存.之所以还去写这篇博文,主要还是记录自己的学习过程.结合源代码一步一步分析一下FreeRTOS究竟是怎么实现的 ...

  9. LwIP 之六 详解动态内存管理 内存池(memp.c/h)

      该文主要是接上一部分LwIP 之 详解动态内存管理 内存堆(mem.c/h),该部分许多内容需要用到上一篇的内容.该部分主要是详细介绍LwIP中的动态内存池.整个内存池的实现相较于内存堆来说,还是 ...

最新文章

  1. linux symbolic link attack tutorial
  2. TextVew中文空格
  3. 抛弃市电!微软建成世界首座天然气数据机房:能耗大减
  4. hdu 5299——Circles Game
  5. Atitit. 数据库-----catalog与schema的设计区别以及在实际中使用 获取数据库所有库表 java jdbc php  c#.Net
  6. detail.html翻译中文,detail是什么意思_detail的翻译_音标_读音_用法_例句_爱词霸在线词典...
  7. 黑马java架构师课_【黑马精品】Java架构师实战训练营
  8. 天气 android 源码,android 天气预报app源码
  9. 信息学奥赛一本通(1097:画矩形)
  10. 求职过程中展示您的社交技巧
  11. NVIDIA GPU Compute Capability
  12. PNG和JPEG格式的区别
  13. 【opencv】18.数字图像一阶导数、二阶导数的数学原理
  14. java中String s=abc及String s=new String(abc)详解
  15. 「镁客·请讲」移康智能朱鹏程:做产品就要直击痛点,多余的功能只会是噱头...
  16. Vue之如何动态渲染.vue文件
  17. 为中国操作系统内核而写的教程 1
  18. 客2消,客1消,客0消...脉脉劝退客户端多次的你们究竟是何用意?
  19. 短视频app源码开发,音视频合成的实现
  20. 计算机与数学交融的教学设计,信息技术与小学数学学科的整合 小学数学教案...

热门文章

  1. php端口转发源码,Python实现TCP/IP协议下的端口转发及重定向示例
  2. centos php ioncube_Linux/Centos 安装PHP ioncube扩展
  3. Acwing--单调栈
  4. java iris_利用K-Means聚类算法实现对iris.data.ulab
  5. python只读打开文件_Python 文件只读打开模式是???????????????????????????????????????
  6. siblings获取不平级_siblings()是获取平级元素,哪不是平级应该怎么获取元素呢?...
  7. graphpad做折线图坐标轴数字_pandas做数据可视化具体操作,快来看看吧
  8. android修改视频聊天帧率,Android基于腾讯云实时音视频仿微信视频通话最小化悬浮(4)...
  9. 使用OpenCV和Python生成视频条形码
  10. kset_register