博客
关于我
C++ 函数需要有返回值,但非全分支return(RVO)
阅读量:718 次
发布时间:2019-03-21

本文共 773 字,大约阅读时间需要 2 分钟。

随着对C++编程的深入学习,对函数的返回值和异常处理有了更深刻的理解。其中一个深刻的现象是,定义了返回值类型的函数必须使用return语句,否则会引发严重的内存问题。这一发现让我深刻认识到代码的规范性和完整性对于程序的正确运行至关重要。

先来看第一个例子,这个函数Test fun(bool flag)在else分支里没有return语句,但尽管如此,能够正常运行并输出正确的内容。这让我非常好奇。通过分析,这其实是取决于拷贝构造函数的使用。当函数返回一个对象时,系统会在栈帧上直接构造该对象,并通过RVO(返回值优化)机制进行优化,这意味着程序能够正确地输出预期的结果。然而,这种情况并不总是如此,特别是当没有return语句时,可能引发指针错误或者内存泄漏。

进一步思考,我发现RVO的作用就在于实现高效的返回对象。C++允许编译器省略临时对象的创建,使得直接返回对象的指针更加高效。但如果关闭了RVO选项,特定情况下会强制调用拷贝构造函数,这就能避免诸多潜在的错误。

接下来的测试表明需要确保每个分支都有返回语句。比如在第二个例子中,虽然有return语句,但在没有覆盖所有分支的情况下,程序会出现内存泄漏。因此,每个分支,特别是如果返回相同类型的对象时,都必须确保有return语句,这样可以避免栈上的内存泄漏或引用错误。

这些发现让我意识到代码的规范性是关键。在编写函数时,必须在每个可能的分支中都有return语句,确保程序能正确返回所需的值。同时,对RVO的理解帮助我更好地理解为什么有时程序会意外地正常运行,而其它情况则不然。

总的来说,这个过程让我对函数返回值的处理有了更深入的理解,特别是在涉及到对象构造和机制方面,这些都会影响到程序的正确性和稳定性。通过这些实践,我的编程技巧得到了提升,也让我更仔细地考虑代码的结构和细节。

转载地址:http://uxqgz.baihongyu.com/

你可能感兴趣的文章
adb通过USB或wifi连接手机
查看>>
JDK9-15新特性
查看>>
TreeSet、TreeMap
查看>>
JVM内存模型
查看>>
可变长度参数
查看>>
3、条件查询
查看>>
cordova打包apk更改图标
查看>>
GitHub上传时,项目在已有文档时直接push出现错误解决方案
查看>>
文件系统的层次结构
查看>>
vue(渐进式前端框架)
查看>>
vscode设置eslint保存文件时自动修复eslint错误
查看>>
Remove Extra one 维护前缀最大最小值
查看>>
Linux操作系统的安装与使用
查看>>
C++ 继承 详解
查看>>
OSPF多区域
查看>>
Docker入门之-镜像(二)
查看>>
去了解拉绳位移编码器的影响因素
查看>>
无法初始化Winsock2.2处理
查看>>
vMotion 操作失败进度卡在14% ,报错: Operation Timed out
查看>>
重置UAG Application admin密码
查看>>