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;
}
你可以先输出这个变量的值(记为A),既然是C++,那么支持变量的随时创建,那么在调用clone2后,你可以再创建几个变量并初始化,然后再输出A,值应该会改变
另外关于为何不回崩溃,栈空间是有限的,我想可能是由于没有超出栈的总空间范围吧,再者说,访问一个内存不一定会出错,出错发生在内存不允许访问(如地址 0 或者对一个只读的文件指针进行写)
函数调用完后,那部分临时内存会释放。 -- 释放的含义是这个空间随时可被其他代码使用。其里面的内容只有在被其他代码使用时覆盖。这叫临时,
计算机的内存不属于城管管理范围的。因为是C++,内存管理都要程序员管理的。Java等的垃圾处理机制就类似于城管,但没有城管那么积极。
如果不是临时内存,则类似于你有张房屋的产权证。当代码要空间时,不会占用那块区域。与现实生活中的区别是,现实生活中空间不够,按照水泥和钢筋的重量计算,如果后者的重量大于现有的,则启动拆迁工程,即使有产权证也没用。
“可是为什么我自己写的下述代码不报错,反而能正常运行呢?” -- 这是因为暂时没有后续代码要使用该空间,所以这块空间里的内容仍旧是原来的。一旦后续代码使用,则由后续代码来接管处理。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。