c++关于生命期的问题

l5250926 2014-03-27 11:17:13
#include<iostream>
using namespace std;
long* fac(int n);
int main()
{
int n;
cout<<"please input a number:";
cin>>n;
long *y=fac(n);
// y=fac(n);
cout<<n<<"!="<<*y<<endl;
return 0;
}
long* fac(int n)
{
long *f;
f=new long;
if(n<0)
{
cout<<"erro!"<<endl;
*f=-1;
}
if(n==0||n==1)
*f=1;
if(n>1)
*f=*(fac(n-1))*n;
return f;
}
这是我今天写的一个程序,我想问 既然函数结束后f指向的内存释放了,那*f的值也应该不在了。y指向f 为什么*y还能正确的输出?
...全文
98 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
l5250926 2014-03-27
  • 打赏
  • 举报
回复
引用 11 楼 neustar1 的回复:
是的
谢谢!
__cc__ 2014-03-27
  • 打赏
  • 举报
回复
引用 10 楼 l5250926 的回复:
[quote=引用 9 楼 neustar1 的回复:] 打个形象的比喻吧: 指针相当于钥匙,你光是定义一个指针呢,就相当于有一把钥匙,然后你new了一下,你建了个房子,这个钥匙来开这个房子的门,哪天你有去配了把钥匙,相当于复制了,自然这把钥匙也能开这个门。 如果一天你不小心掉了一把钥匙,难道你另外一把钥匙就不能开门了吗?钥匙之间是互不影响的,显然是可以继续用啦。 只有你delete了这个房子,无论是哪把钥匙才都没有用了。
意思是 释放的时候指针指向的内存还有那个内存里的值还在,只不过f不存在了?[/quote] 是的
l5250926 2014-03-27
  • 打赏
  • 举报
回复
引用 9 楼 neustar1 的回复:
打个形象的比喻吧: 指针相当于钥匙,你光是定义一个指针呢,就相当于有一把钥匙,然后你new了一下,你建了个房子,这个钥匙来开这个房子的门,哪天你有去配了把钥匙,相当于复制了,自然这把钥匙也能开这个门。 如果一天你不小心掉了一把钥匙,难道你另外一把钥匙就不能开门了吗?钥匙之间是互不影响的,显然是可以继续用啦。 只有你delete了这个房子,无论是哪把钥匙才都没有用了。
意思是 释放的时候指针指向的内存还有那个内存里的值还在,只不过f不存在了?
__cc__ 2014-03-27
  • 打赏
  • 举报
回复
引用 8 楼 l5250926 的回复:
[quote=引用 6 楼 neustar1 的回复:] [quote=引用 5 楼 l5250926 的回复:] [quote=引用 3 楼 neustar1 的回复:] [quote=引用 楼主 l5250926 的回复:] 这是我今天写的一个程序,我想问 既然函数结束后f指向的内存释放了,那*f的值也应该不在了。y指向f 为什么*y还能正确的输出?
不好意思,你这里是new,函数接收后,这个没有释放掉。释放掉的是存在堆栈里的东西。 在外面使用完,要delete,不然内存泄露[/quote] 局部变量在函数结束后不是要被释放吗? f也是局部变量啊,为什么f指向的地址里的数据还存在?[/quote] f的确不在了: 返回的时候return f;这条语句的时候f还是在的,指令会把f的值复制到寄存器中再返回出去。当返回出去的时候,f虽然不在了,但是寄存器里的值,也就是你new出来的那块内存还在,所以你仍然可以用这个返回的指针。不知道明白否?[/quote] 哎,对内存这块不怎么熟啊 还是不是很懂,我的理解是 return f 是返回的f的一个副本,如果f不是指针我还能理解,但是f是个指针,他本身所指向的空间已经被释放了 为什么他的副本还能用。。。真烦人 [/quote] 打个形象的比喻吧: 指针相当于钥匙,你光是定义一个指针呢,就相当于有一把钥匙,然后你new了一下,你建了个房子,这个钥匙来开这个房子的门,哪天你有去配了把钥匙,相当于复制了,自然这把钥匙也能开这个门。 如果一天你不小心掉了一把钥匙,难道你另外一把钥匙就不能开门了吗?钥匙之间是互不影响的,显然是可以继续用啦。 只有你delete了这个房子,无论是哪把钥匙才都没有用了。
l5250926 2014-03-27
  • 打赏
  • 举报
回复
引用 6 楼 neustar1 的回复:
[quote=引用 5 楼 l5250926 的回复:] [quote=引用 3 楼 neustar1 的回复:] [quote=引用 楼主 l5250926 的回复:] 这是我今天写的一个程序,我想问 既然函数结束后f指向的内存释放了,那*f的值也应该不在了。y指向f 为什么*y还能正确的输出?
不好意思,你这里是new,函数接收后,这个没有释放掉。释放掉的是存在堆栈里的东西。 在外面使用完,要delete,不然内存泄露[/quote] 局部变量在函数结束后不是要被释放吗? f也是局部变量啊,为什么f指向的地址里的数据还存在?[/quote] f的确不在了: 返回的时候return f;这条语句的时候f还是在的,指令会把f的值复制到寄存器中再返回出去。当返回出去的时候,f虽然不在了,但是寄存器里的值,也就是你new出来的那块内存还在,所以你仍然可以用这个返回的指针。不知道明白否?[/quote] 哎,对内存这块不怎么熟啊 还是不是很懂,我的理解是 return f 是返回的f的一个副本,如果f不是指针我还能理解,但是f是个指针,他本身所指向的空间已经被释放了 为什么他的副本还能用。。。真烦人
l5250926 2014-03-27
  • 打赏
  • 举报
回复
哎,对内存这块不怎么熟啊 还是不是很懂,我的理解是 return f 是返回的f的一个副本,如果f不是指针我还能理解,但是f是个指针,他本身所指向的空间已经被释放了 为什么他的副本还能用。。。真烦人
__cc__ 2014-03-27
  • 打赏
  • 举报
回复
引用 5 楼 l5250926 的回复:
[quote=引用 3 楼 neustar1 的回复:] [quote=引用 楼主 l5250926 的回复:] 这是我今天写的一个程序,我想问 既然函数结束后f指向的内存释放了,那*f的值也应该不在了。y指向f 为什么*y还能正确的输出?
不好意思,你这里是new,函数接收后,这个没有释放掉。释放掉的是存在堆栈里的东西。 在外面使用完,要delete,不然内存泄露[/quote] 局部变量在函数结束后不是要被释放吗? f也是局部变量啊,为什么f指向的地址里的数据还存在?[/quote] f的确不在了: 返回的时候return f;这条语句的时候f还是在的,指令会把f的值复制到寄存器中再返回出去。当返回出去的时候,f虽然不在了,但是寄存器里的值,也就是你new出来的那块内存还在,所以你仍然可以用这个返回的指针。不知道明白否?
l5250926 2014-03-27
  • 打赏
  • 举报
回复
引用 3 楼 neustar1 的回复:
[quote=引用 楼主 l5250926 的回复:] 这是我今天写的一个程序,我想问 既然函数结束后f指向的内存释放了,那*f的值也应该不在了。y指向f 为什么*y还能正确的输出?
不好意思,你这里是new,函数接收后,这个没有释放掉。释放掉的是存在堆栈里的东西。 在外面使用完,要delete,不然内存泄露[/quote] 局部变量在函数结束后不是要被释放吗? f也是局部变量啊,为什么f指向的地址里的数据还存在?
derekrose 2014-03-27
  • 打赏
  • 举报
回复
你又没有delete 哪里释放了
__cc__ 2014-03-27
  • 打赏
  • 举报
回复
引用 楼主 l5250926 的回复:
#include<iostream> using namespace std; long* fac(int n); int main() { int n; cout<<"please input a number:"; cin>>n; long *y=fac(n); // y=fac(n); cout<<n<<"!="<<*y<<endl; return 0; } long* fac(int n) { long *f; f=new long; if(n<0) { cout<<"erro!"<<endl; *f=-1; } if(n==0||n==1) *f=1; if(n>1) *f=*(fac(n-1))*n; return f; } 这是我今天写的一个程序,我想问 既然函数结束后f指向的内存释放了,那*f的值也应该不在了。y指向f 为什么*y还能正确的输出?
不好意思,你这里是new,函数接收后,这个没有释放掉。释放掉的是存在堆栈里的东西。 在外面使用完,要delete,不然内存泄露
max_min_ 2014-03-27
  • 打赏
  • 举报
回复
栈和堆是不一样的哦!
FancyMouse 2014-03-27
  • 打赏
  • 举报
回复
>既然函数结束后f指向的内存释放了 你这f是new出来的,不会自动给你delete。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧