c++ 临时变量问题?
ringa_lee
ringa_lee 2017-04-17 13:32:43
[C++讨论组]
#include 
#include 
using namespace std;

const string& Func()
{
    return "123";
}

int main()
{
    string s = Func();

    cout << s << endl;

    return 0;
}

const 引用不是会提升临时变量的生命期吗? 为什么返回函数内的临时变量会报错了? 我对const引用的理解哪里错了吗?

#include 
#include 
using namespace std;

const string& Func(const string& s)
{
    return s;
}

int main()
{
    string s = Func("123");

    cout << s << endl;

    return 0;
}

但是这段代码就可以了。 Func函数参数绑定到一个临时变量,然后返回这个临时变量的const引用,就没有问题?
why?

ringa_lee
ringa_lee

ringa_lee

全部回复(4)
ringa_lee

第一段程序main方法:
改为:
const string s = Func();

PHPz

返回函数内定义的局部变量是未定义行为。

const string& Func()
{
    return "123";  // 返回定义在函数 Func 里的局部变量 "123",是未定义行为。
}  // 变量 "123" 在此处被销毁

int main()
{
    string s = Func();  // s 指向已被销毁的变量

    cout << s << endl;

    return 0;
}
const string& Func(const string& s)
{
    return s;  // 返回函数外定义的变量的引用 s
}

int main()
{
    string s = Func("123");  // s 指向定义在函数 main 里的局部变量 "123"

    cout << s << endl;

    return 0;
}  // 变量 "123" 在此处被销毁
PHPz

你这里const是不会提升局部变量的生命周期的,局部变量是存放在栈上,函数返回的时候相应的栈会被释放,也就是局部变量也会被销毁。你第一个程序不是局部变量声明周期的问题,const是代表不能修改的意思,但是你的s变量没有用const修饰,所以不能赋值。

ringa_lee

个人觉得,上面的回答都有些问题。。。
看题主的代码:

#include <iostream>
#include <string>
using namespace std;

const string& Func()
{
    return "123";
}

int main()
{
    string s = Func();

    cout << s << endl;

    return 0;
}

  这段代码确实会报错,但是只要把 const string& Func() 中的 & 去掉就可以了。出错的原因并不是"123"在栈中,当函数返回时出栈导致的错误。而是,"123"本身是在静态数据区的,当函数返回时实际返回的是"123"在静态数据区的地址,该地址在函数Func中是局部变量(在栈中),此时,我们使用引用类型返回该局部变量的(但是,会发生出栈操作),我们的引用变量被释放了,就会出错。但是,如果我们不使用 & ,返回的时候我们实际得到的是地址值的中间变量(函数的非引用返回值都会保存在中间变量中),此时栈操作是不影响我们获取正确的地址值的。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号