zoukankan      html  css  js  c++  java
  • CPP笔记_函数返回局部变量

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

      我们知道,在函数中创建的局部变量会随着函数的调用过程的结束,也即其对应函数栈帧的清除,而结束其生命周期。那么,如果我们把这个局部变量返回,就有可能存在该变量对应的数据已经清除,而发生错误。所以,我们在返回值的时候一定要注意。那到底详细的情况是怎么样的呢?先上结论:对于在函数中定义的局部变量,如果是以指针或者引用的形式返回,那么将产生错误的结果。如果是以传值的方式返回,那么将没问题,因为返回的是对象的副本,它在函数结束之后仍然存在。关于创建副本这个问题,现在编译器都有一个叫做NRV的优化操作来避免创建副本以节省开销,请参考http://www.cnblogs.com/xkfz007/articles/2506022.html

      以传值的方式返回

     1 //函数定义:以传值的方式返回局部变量
     2 vector<int>  getMyVector()
     3 {
     4     vector<int> vec;
     5     for (int i = 0; i < 5; ++i)
     6     {
     7         vec.push_back(i);
     8     }
     9     return vec;
    10 }
    11 
    12 //外部调用
    13 vector<int> vec = getMyVector();
    14 for (int i = 0; i < 5; ++i)
    15 {
    16     cout <<vec[i]<<endl;
    17 
    18 }

      将会看到在外部调用中正确的打印出01234.

      以引用的方式返回

    1 vector<int> & getMyVector()
    2 {
    3     vector<int> vec;
    4     for (int i = 0; i < 5; ++i)
    5     {
    6         vec.push_back(i);
    7     }
    8     return vec;
    9 }

      在编译的时候将会看到一个警告:warning C4172: 返回局部变量或临时变量的地址,且执行函数的时候也发生了内存访问错误的报错。

      以指针的方式的返回

    1 vector<int> * getMyVector()
    2 {
    3     vector<int> vec;
    4     for (int i = 0; i < 5; ++i)
    5     {
    6         vec.push_back(i);
    7     }
    8     return &vec;
    9 }

      同以引用的方式返回一样,将会产生警告,且发生内存访问错误。但是如果我们把上面的函数定义改成:

    1 vector<int> * getMyVector()
    2 {
    3     vector<int> *vec = new vector<int>();
    4     for (int i = 0; i < 5; ++i)
    5     {
    6         vec->push_back(i);
    7     }
    8     return vec;
    9 }

      那么,编译器将不会弹出警告,且执行正常。因为使用new创建的对象都分配在堆上,不会随着函数调用的介绍而自动释放,需要程序员手动去释放对应的内存空间。

  • 相关阅读:
    波段是金牢记六大诀窍
    zk kafka mariadb scala flink integration
    Oracle 体系结构详解
    图解 Database Buffer Cache 内部原理(二)
    SQL Server 字符集介绍及修改方法演示
    SQL Server 2012 备份与还原详解
    SQL Server 2012 查询数据库中所有表的名称和行数
    SQL Server 2012 查询数据库中表格主键信息
    SQL Server 2012 查询数据库中所有表的索引信息
    图解 Database Buffer Cache 内部原理(一)
  • 原文地址:https://www.cnblogs.com/willhua/p/6748010.html
Copyright © 2011-2022 走看看