本篇笔记记录的是关于返回函数中的局部值。

  我们知道,在函数中创建的局部变量会随着函数的调用过程的结束,也即其对应函数栈帧的清除,而结束其生命周期。那么,如果我们把这个局部变量返回,就有可能存在该变量对应的数据已经清除,而发生错误。所以,我们在返回值的时候一定要注意。那到底详细的情况是怎么样的呢?先上结论:对于在函数中定义的局部变量,如果是以指针或者引用的形式返回,那么将产生错误的结果。如果是以传值的方式返回,那么将没问题,因为返回的是对象的副本,它在函数结束之后仍然存在。关于创建副本这个问题,现在编译器都有一个叫做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笔记_函数返回局部变量的更多相关文章

  1. C语言的那些秘密之---函数返回局部变量[转]

    来源:http://blog.csdn.net/haiwil/article/details/6691854/ 一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部 ...

  2. [转]C语言的那些秘密之---函数返回局部变量

    一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了.因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错.但是如果返回的是局部变量的地 ...

  3. C-基础:函数返回局部变量

    一般的来说,函数是可以返回局部变量的. 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了.因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错.但是如果返回的是局部变量的地 ...

  4. 第2章KNN算法笔记_函数classify0

    <机器学习实战>知识点笔记目录 K-近邻算法(KNN)思想: 1,计算未知样本与所有已知样本的距离 2,按照距离递增排序,选前K个样本(K<20) 3,针对K个样本统计各个分类的出现 ...

  5. C++函数返回局部变量

    函数不能返回指向栈内存的指针 原因:返回值是拷贝值,局部变量的作用域为函数内部,函数执行结束,栈上的局部变量会销毁,内存释放. 可返回的局部变量: 1. 返回局部变量本身 int sum(int a, ...

  6. python函数返回局部变量,局部&全局变量同名问题

    其实关于返回局部变量不只是python的问题,凡是使用堆栈结构处理函数的语言都会有这样的问题,切记不要返回局部变量.因为当创建函数的堆栈撤销,所有对局部变量的修改都灰飞烟灭.来看我的小例子 def h ...

  7. matlab学习笔记13_1 函数返回值

    一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...

  8. python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明

    一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...

  9. haskell学习笔记_函数

    一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...

随机推荐

  1. Python档案袋( Json、pickle、加密与解密)

    Json是各程序通用的数据格式:pickle是Python特有的,可以存储很多Python特有的数据,如函数地址等 Json的简单使用: import json jsondata={ "us ...

  2. 你还在 Select * 吗?

    应用程序慢如牛,原因多多,可能是网络的原因.可能是系统架构的原因,还有可能是数据库的原因. 那么如何提高数据库SQL语句执行速度呢?有人会说性能调优是数据库管理员(DBA)的事,然而性能调优跟程序员们 ...

  3. J2EE-tomcat的配置

    修改web.xml文件里面的内容:  路径:D:\software\apache-tomcat-8.0.44\webapps\ROOT\WEB-INF\web.xml: 内容:<?xml ver ...

  4. 使用vue-cli搭建vue项目

    1.安装node环境,然后在命令行输入node -v 和npm -v 查看版本号 2.在正式开始项目之前我们先介绍一下vue-cli,vue-cli是一个脚手架工具,vue-cli是帮助我们写好vue ...

  5. 【机器学习】--Kmeans从初识到应用

    一.前述 Kmeans算法一般在数据分析前期使用,选取适当的k,将数据分类后,然后分类研究不同聚类下数据的特点. Kmeans算法是一种无监督的算法. 常用于分组,比如用户偏好. 二.概念及原理 Km ...

  6. 经典案例复盘——运维专家讲述如何实现K8S落地

    经典案例复盘——运维专家讲述如何实现K8S落地 背景介绍 运满满自开始微服务改造以来,线上线下已有数千个微服务的 Java 实例在运行中.这些 Java 实例部署在数百台云服务器或虚机上,除少数访问量 ...

  7. Zabbix Server端配置文件说明

    zabbix作为运维邻域不可缺少的一员,它的各种文档可是数不胜数啊,但是关于配置文件的解释与说明就有点少.这里列出zabbix配置文件篇之zabbix_server. Zabbix Server端配置 ...

  8. 《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...

  9. Lucene 07 - 对Lucene的索引库进行增删改查

    目录 1 添加索引 2 删除索引 2.1 根据Term删除索引 2.2 删除全部索引(慎用) 3 更新索引 数据保存在关系型数据库中, 需要实现增.删.改.查操作; 索引保存在索引库中, 也需要实现增 ...

  10. Asp.Net Core中利用Seq组件展示结构化日志功能

    在一次.Net Core小项目的开发中,掌握的不够深入,对日志记录并没有好好利用,以至于一出现异常问题,都得跑动服务器上查看,那时一度怀疑自己肯定没学好,不然这一块日志不可能需要自己扒服务器日志来查看 ...