CPP笔记_函数返回局部变量
本篇笔记记录的是关于返回函数中的局部值。
我们知道,在函数中创建的局部变量会随着函数的调用过程的结束,也即其对应函数栈帧的清除,而结束其生命周期。那么,如果我们把这个局部变量返回,就有可能存在该变量对应的数据已经清除,而发生错误。所以,我们在返回值的时候一定要注意。那到底详细的情况是怎么样的呢?先上结论:对于在函数中定义的局部变量,如果是以指针或者引用的形式返回,那么将产生错误的结果。如果是以传值的方式返回,那么将没问题,因为返回的是对象的副本,它在函数结束之后仍然存在。关于创建副本这个问题,现在编译器都有一个叫做NRV的优化操作来避免创建副本以节省开销,请参考http://www.cnblogs.com/xkfz007/articles/2506022.html
以传值的方式返回
//函数定义:以传值的方式返回局部变量
vector<int> getMyVector()
{
vector<int> vec;
for (int i = ; i < ; ++i)
{
vec.push_back(i);
}
return vec;
} //外部调用
vector<int> vec = getMyVector();
for (int i = ; i < ; ++i)
{
cout <<vec[i]<<endl; }
将会看到在外部调用中正确的打印出01234.
以引用的方式返回
vector<int> & getMyVector()
{
vector<int> vec;
for (int i = ; i < ; ++i)
{
vec.push_back(i);
}
return vec;
}
在编译的时候将会看到一个警告:warning C4172: 返回局部变量或临时变量的地址,且执行函数的时候也发生了内存访问错误的报错。
以指针的方式的返回
vector<int> * getMyVector()
{
vector<int> vec;
for (int i = ; i < ; ++i)
{
vec.push_back(i);
}
return &vec;
}
同以引用的方式返回一样,将会产生警告,且发生内存访问错误。但是如果我们把上面的函数定义改成:
vector<int> * getMyVector()
{
vector<int> *vec = new vector<int>();
for (int i = ; i < ; ++i)
{
vec->push_back(i);
}
return vec;
}
那么,编译器将不会弹出警告,且执行正常。因为使用new创建的对象都分配在堆上,不会随着函数调用的介绍而自动释放,需要程序员手动去释放对应的内存空间。
CPP笔记_函数返回局部变量的更多相关文章
- C语言的那些秘密之---函数返回局部变量[转]
来源:http://blog.csdn.net/haiwil/article/details/6691854/ 一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部 ...
- [转]C语言的那些秘密之---函数返回局部变量
一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了.因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错.但是如果返回的是局部变量的地 ...
- C-基础:函数返回局部变量
一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了.因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错.但是如果返回的是局部变量的地 ...
- 第2章KNN算法笔记_函数classify0
<机器学习实战>知识点笔记目录 K-近邻算法(KNN)思想: 1,计算未知样本与所有已知样本的距离 2,按照距离递增排序,选前K个样本(K<20) 3,针对K个样本统计各个分类的出现 ...
- C++函数返回局部变量
函数不能返回指向栈内存的指针 原因:返回值是拷贝值,局部变量的作用域为函数内部,函数执行结束,栈上的局部变量会销毁,内存释放. 可返回的局部变量: 1. 返回局部变量本身 int sum(int a, ...
- python函数返回局部变量,局部&全局变量同名问题
其实关于返回局部变量不只是python的问题,凡是使用堆栈结构处理函数的语言都会有这样的问题,切记不要返回局部变量.因为当创建函数的堆栈撤销,所有对局部变量的修改都灰飞烟灭.来看我的小例子 def h ...
- matlab学习笔记13_1 函数返回值
一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...
- python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明
一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...
- haskell学习笔记_函数
一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...
随机推荐
- Java面试中笔试题——Java代码真题,这些题会做,笔试完全可拿下!
大家好,我是上海尚学堂Java培训老师,以下这些Java笔试真题是上海尚学堂Java学员在找工作中笔试遇到的真题.现在分享出来,也写了参考答案,供大家学习借鉴.想要更多学习资料和视频请留言联系或者上海 ...
- [Swift]LeetCode378. 有序矩阵中第K小的元素 | Kth Smallest Element in a Sorted Matrix
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...
- [Swift]LeetCode503. 下一个更大元素 II | Next Greater Element II
Given a circular array (the next element of the last element is the first element of the array), pri ...
- CentOS6.9下离线部署Django项目
最近项目服务器变动,研究了CentOS6.9下httpd2.4+django1.11.16+python3.6+PostgreSQL的部署,之前还有一个ubuntu16.04下的部署等以后整理好后再来 ...
- Eclipse debug Source not found
点击打开链接最近开始慢慢转向idea开发了,但是因为旧项目是在eclipse里面.就没有在idea导入,所以旧项目就用eclipse,新项目就用idea.然而最近几天eclipse似乎不干了,每次de ...
- qt程序启动播放动画
qt程序启动播放动画 编辑删除转载 2016-01-20 10:23:11 标签:qt启动动画 1.播放动画 QAxWidget *flash = , ); //QAxWidget使用的是Active ...
- SpringBoot入门教程(十五)集成Druid
Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB ...
- ADO.NET五大对象详解
Connection 连接对象 用于对数据库的连接操作.传入的参数为连接字符串. Commamd 命令对象 用于执行对数据库的操作 ,传入的参数可以为连接字符串或存储过程,也必须传入连接对象的实例. ...
- 带着新人学springboot的应用12(springboot+Dubbo+Zookeeper 下)
上半节已经下载好了Zookeeper,以及新建了两个应用provider和consumer,这一节我们就结合dubbo来测试一下分布式可不可以用. 现在就来简单用一下,注意:这里只是涉及最简单的部分, ...
- Java基础18:Java序列化与反序列化
更多内容请关注微信公众号[Java技术江湖] 这是一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM.SpringBoot.MySQL.分布式.中间件.集群.Linux ...