博客
关于我
C++ 函数需要有返回值,但非全分支return(RVO)
阅读量:720 次
发布时间: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/

你可能感兴趣的文章
pair的用法
查看>>
Flex 布局的自适应子项内容过长导致其被撑大问题
查看>>
PL/SQL 动态Sql拼接where条件
查看>>
Error:Cannot read packageName from AndroidManifest.xml
查看>>
【换行符】什么时候用cin.get()吃掉输入流中的换行符
查看>>
广东外语外贸大学第三届网络安全大赛Writeup
查看>>
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
查看>>
Thymeleaf sec:authorize 标签不生效
查看>>
微信JS-SDK DEMO页面和示例代码
查看>>
测试tensorflow是否安装成功 出现 SyntaxError: invalid syntax的错误
查看>>
Flask--简介
查看>>
Frame--Api框架
查看>>
Boostrap技能点整理之【网格系统】
查看>>
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
查看>>
Git简单理解与使用
查看>>
echarts 基本图表开发小结
查看>>
adb通过USB或wifi连接手机
查看>>
JDK9-15新特性
查看>>
TreeSet、TreeMap
查看>>
JVM内存模型
查看>>