函数返回值基础问题请教

AprilZhu 2007-05-08 09:38:38
函数返回时是将返回值拷贝到某个寄存器中,实际上返回的是拷贝的值而不是原来的值。不知道我这样理解正确吗?
那么如下的函数有什么问题呢?
int fun()
{
int *p=new int(5);
return *p;
}
int main()
{
int a=fun();
return 0;
}
我的理解是将*p的值(也就是5)拷贝到寄存器中,然后将5返回;可是在程序运行时有错,除了内存泄露外还有哪些错误呢?感觉我对程序返回的原理不甚明了。望大家指教!!
...全文
307 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
freshui(五月的风)解释的很清楚
AprilZhu 2007-05-11
  • 打赏
  • 举报
回复
恩,你说的我就更不懂了。能否指点一二,或者介绍本书看看
redex 2007-05-10
  • 打赏
  • 举报
回复
想完全弄明白函数返回值的问题还得反汇编, 从c/c++的角度谈"临时值"的概念
还是太空了.
freshui 2007-05-08
  • 打赏
  • 举报
回复
你fun函数中返回 *p没有任何意义的
你return *p 还不如直接返回
return 5 呢

你的
int fun()
{
int *p=new int(5);
return *p;
}
*p 是在堆中申请的内存,这个记得要释放的
你在堆中申请的东西 return的时候就不能返回值,而是指针,这样才好操作
你想一想,函数中申请了内存, 而仅仅是返回值,return退出函数后申请的区域怎么办?不管了?

还有,返回值的问题
返回值 return *p
相当于创建一个临时变量 tmp
tmp = *p
然后在调用函数的时候直接把这个tmp赋值给相关的变量即可

AprilZhu 2007-05-08
  • 打赏
  • 举报
回复
恩,也就是说问题还在内存泄露方面。其实我更想明白的是函数返回值问题,不知道我的理解是否正确?或者更全面的讲解
freshui 2007-05-08
  • 打赏
  • 举报
回复
嗯 这个很简单, 就是你new了一个东西 没有delete
而且你在一个函数内new出来, 函数外使用, 有没有全局变量或者别的什么东西保存变量的地址, 是有很大的问题的

改成这样,稍微好些:

int* fun()
{
int *p=new int(5);
return p;
}
int main()
{
int* a=fun();
printf("%d", *a);
delete a;
return 0;
}
yulefox 2007-05-08
  • 打赏
  • 举报
回复
return *p,此时将产生一个int型的临时对象并返回,程序可以正确执行(我用VS05),但正如你说的,肯定是用内存泄露的。
AprilZhu 2007-05-08
  • 打赏
  • 举报
回复
恩,谢谢了,子函数中申请到的内存在返回时尽可能的返回指针,这样才能对内存有效管理。
看样我理解的函数返回值问题也是正确的了。

65,212

社区成员

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

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