开发者社区> 问答> 正文

C++引用变量问题,函数中临时变量返回引用

C++ primer plus第六版引用一节,说不能在函数中新建一个变量,并将其引用返回。道理我都懂,就是说函数调用完后,那部分临时内存会释放。可是为什么我自己写的下述代码不报错,反而能正常运行呢?

#include 
using namespace std;
struct free_throws //此处定义一个结构体
{
int i;
};

const free_throws & clone2(free_throws & ft1, free_throws & ft2); //函数声明
int main()
{
free_throws ftt,ft1,ft2; //新建三个结构体
ft1 = { 6 };
ft2 = { 4 };
ftt = clone2(ft1,ft2); //|按道理这块应该崩溃,但没崩
cout << ftt.i;
return 0;
}
const free_throws & clone2(free_throws & ft1, free_throws & ft2)
{
free_throws newguy;

newguy.i = ft1.i + ft2.i;
return newguy;
}

展开
收起
a123456678 2016-03-06 13:55:05 2667 0
1 条回答
写回答
取消 提交回答
  • 你可以先输出这个变量的值(记为A),既然是C++,那么支持变量的随时创建,那么在调用clone2后,你可以再创建几个变量并初始化,然后再输出A,值应该会改变
    另外关于为何不回崩溃,栈空间是有限的,我想可能是由于没有超出栈的总空间范围吧,再者说,访问一个内存不一定会出错,出错发生在内存不允许访问(如地址 0 或者对一个只读的文件指针进行写)
    函数调用完后,那部分临时内存会释放。 -- 释放的含义是这个空间随时可被其他代码使用。其里面的内容只有在被其他代码使用时覆盖。这叫临时,
    计算机的内存不属于城管管理范围的。因为是C++,内存管理都要程序员管理的。Java等的垃圾处理机制就类似于城管,但没有城管那么积极。
    如果不是临时内存,则类似于你有张房屋的产权证。当代码要空间时,不会占用那块区域。与现实生活中的区别是,现实生活中空间不够,按照水泥和钢筋的重量计算,如果后者的重量大于现有的,则启动拆迁工程,即使有产权证也没用。
    “可是为什么我自己写的下述代码不报错,反而能正常运行呢?” -- 这是因为暂时没有后续代码要使用该空间,所以这块空间里的内容仍旧是原来的。一旦后续代码使用,则由后续代码来接管处理。

    2019-07-17 18:54:30
    赞同 展开评论 打赏
问答分类:
C++
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载