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

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

    安装 axios npm install axios --save 创建实例 (utils/fetch.js) axios 默认提交格式为:application/json 可使用 qs 模块(需要安 ...

  2. 【面试篇】资深招聘HR有哪些面试技巧?

    15年资深招聘HR总结的面试技巧     1.做一下自我介绍 了解应聘者的基本信息和工作经历 2.以往工作中您的职责是什么? 了解应聘者的相关工作经验和其系统性全面性 3.请讲一下您以往的工作经历. ...

  3. 字符串匹配(一)----Rabin-Karp算法

    题目:假如要判断字符串A"ABA"是不是字符串B"ABABABA"的子串. 解法一:暴力破解法, 直接枚举所有的长度为3的子串,然后依次与A比较,这样就能得出匹 ...

  4. [Swift]LeetCode16. 最接近的三数之和 | 3Sum Closest

    Given an array nums of n integers and an integer target, find three integers in nums such that the s ...

  5. [Swift]LeetCode216. 组合总和 III | Combination Sum III

    Find all possible combinations of k numbers that add up to a number n, given that only numbers from ...

  6. [Swift]LeetCode575. 分糖果 | Distribute Candies

    Given an integer array with even length, where different numbers in this array represent different k ...

  7. [Swift]LeetCode639. 解码方法 2 | Decode Ways II

    A message containing letters from A-Z is being encoded to numbers using the following mapping way: ' ...

  8. Redis 设计与实现 (五)--多机数据库的实现

    多机数据库的实现 一.复制 slaveof  主服务器ip地址.形成主从关系. 1.同步  从向主服务器发送sync命令.  主服务器收到sync命令执行bgsave,生成rdb文件,缓冲区同时记录从 ...

  9. 开启SSH

    开启 ssh 远程连接 1.修改 sshd_config 输入 sudo vim /etc/ssh/sshd_config 做如下修改 PermitRootLogin yes [需要把注释 #号去掉, ...

  10. Go使用Makefile构建

    ​ 我们平常很多时候都是直接在命令行输入go build进行编译的: go build . 或者测试使用go run运行项目 go run main.go 我看有很多大型开源项目都是如下方式: mak ...