关于函数返回后,内存是否释放的一个简单例子!

logpushpin 2004-12-16 10:32:35
#include <stdlib.h>
#include <stdio.h>

int * fmalloc()
{
int a = 100;
int *ptr;

ptr = &a;
return ptr;
}

int main(int argc, char *argv[])
{
int *tmp;

tmp = fmalloc();
printf("TMP is %d\n",*tmp);

return EXIT_SUCCESS;
}

此程序的运行结果是 TMP is 100,我就想不明白了啊,函数fmalloc()返回后应该释放a啊,为什么,还能获得a的内容呢,想知道具体的原因和这样做是否有什么潜在的危险,谢谢
...全文
288 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
winux0 2005-01-12
  • 打赏
  • 举报
回复
上面有些说错的地方
T temp = func();
temp是通过拷贝赋值的操作得到函数func()中的返回值
而这个时候func()已经退出,所以而func()内部在return t的时候,会通过拷贝构造函数生成一个临时的T类型的对象,这个对象再在main()中“T temp = ”的时候通过拷贝赋值传给temp
不知道我说清楚了没有
winux0 2005-01-12
  • 打赏
  • 举报
回复
int * fmalloc()
函数中a是局部变量,放在栈中,指针指向栈中地址并返回,地址依然有效,你随便用它没有任何问题,只是如果有其他压栈操作也会将该内存内容修改
如果是
int func( void)
{ int vint;
...
return vint;
}

这样用,int temp = func();
temp会被func()函数的返回值初始化,所以没问题
就好像
class T
{
...
};
T func()
{
T t;
return t;
}
int main()
{
T temp = func();
}

main()中的temp会被func()的返回值初始化,默认会调用拷贝构造函数,如果没有的话就会按位直接复制,这又会引出很多问题(如果该类中有指针)
但对于普通类型,int, long,char什么的就不会出任何问题
这也是为什么我们在设计一个类的时候要尽量提供拷贝构造函数,当然也不一定
seayea 2005-01-12
  • 打赏
  • 举报
回复
深拷贝、浅拷贝的问题
栈内存、堆内存回收的问题
野指针的问题

都是经典问题。林锐的《C/C++高质量编程》里面讲的比较通俗易懂。
yuanwh121 2005-01-11
  • 打赏
  • 举报
回复
最好不要用返回值,
用参数传出。
比如:
void foo(char *arg)
{
char *str;
//str赋值
strcpy(arg, str);
}

就可以了,局部变量str在栈里,会自动消亡。
weepp 2004-12-17
  • 打赏
  • 举报
回复
已经分配地址了,地址里的值也付了,而且你也没有释放指针!建议看看老谭的书!
yanedanny 2004-12-17
  • 打赏
  • 举报
回复
整数返回那是放在栈内存上,当然没有释放的问题。
logpushpin 2004-12-17
  • 打赏
  • 举报
回复
嗯! ok,谢谢哦
logpushpin 2004-12-17
  • 打赏
  • 举报
回复
to weepp(地方反对) ( ): 释放什么啊? 我又没有malloc,我释放个毛啊? 哈哈
gaoxianfeng 2004-12-17
  • 打赏
  • 举报
回复
倒,地址内的数据如果你没有再次重写此地址内数据, 内容是不变的。

只是使用这个返回值时是不安全的,不可预知的
MaxMarvel 2004-12-16
  • 打赏
  • 举报
回复
这么说局部指针变量不能返回了。。。。
pacman2000 2004-12-16
  • 打赏
  • 举报
回复
这个部分虽然被释放了,但是并没有立刻改写里面的值,但是你这样用是非常危险的。
retal 2004-12-16
  • 打赏
  • 举报
回复
是这样的么?
学习中
AlphaCN_NET 2004-12-16
  • 打赏
  • 举报
回复
释放之后内容依然是空,只不过内存管理把该部分标定为未使用的内存,而且没有对内存进行清零
所以依然会获得内容
logpushpin 2004-12-16
  • 打赏
  • 举报
回复
天天搞来搞去,好像很忙碌的样子,可是这样的简单的东东,时不时的就迷糊了! 郁闷ing
CoolQ 2004-12-16
  • 打赏
  • 举报
回复
你还真要看覆盖的例子么?建议你多学点汇编,这些东西就很明白了。尤其是栈内部的结构
一个覆盖的例子,把你原来的程序改一下就可以了。
#include <stdlib.h>
#include <stdio.h>

int * fmalloc_1()
{
int a = 100;
int *ptr;

ptr = &a;
return ptr;
}
int * fmalloc_2()
{
int a = 200;
int *ptr;

ptr = &a;
return ptr;
}

int main(int argc, char *argv[])
{
int *tmp;

tmp = fmalloc_1();
tmp = fmalloc_2();
printf("TMP is %d\n",*tmp);

return EXIT_SUCCESS;
}
TMP is 200
logpushpin 2004-12-16
  • 打赏
  • 举报
回复
再腚
logpushpin 2004-12-16
  • 打赏
  • 举报
回复
logpushpin 2004-12-16
  • 打赏
  • 举报
回复
我再总结,哈哈,是不是说呢,在一个函数中定义的变量值,比如说整数,是可以return的! 但是,指针呢,就会有问题,如果这个指针指向的地址,是在这个函数内部分配的,返回后,就有可能被覆盖,例子如下
-----------
例子一:
int func( void )
{ int vint;
...
...
return vint;
}
例子二:
int *func( void )
{ int a;
int *b;
b = &a;
...
return b;
}
----------
例子一我感觉应该是没有问题的,考,返回个破数嘛,但是例子二呢,返回的指针,如果再去引用这个指针的时候,里面的内容就有可能被别的程序覆盖,对吧?
----------
我总是对基本的概念,稀里糊涂,高手啊,麻烦说清楚哦
pleasehelpme 2004-12-16
  • 打赏
  • 举报
回复
to: logpushpin(卖女孩的小火柴)
很是危险就不能用了是吧? 就是说有可能被覆盖,然后再取可能已经被别的程序修改对吧?

那么呢,比如说一个函数
int func( void)
{ int vint;
...
return vint;
}
这种写法就是有问题的对吧,哪就是说在函数内部定义的东东,不能返回对吧! 要返回的话就用函数外部定义的全局变量或者等等,对吧?
感谢大家啊!


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这样正确,可以做右值,但不能做左值。你可以看看the c++ programing language,上面很清楚。
xfzhao_cn 2004-12-16
  • 打赏
  • 举报
回复
这样写,绝对是错的.你首先要确定,值与指针的区别.
加载更多回复(1)
"plist图片查看工具 v1.2"是一款专为Mac用户设计的应用程序,旨在帮助开发者和设计师更方便地管理和查看.plist格式的图片资源。在iOS和Cocos2d-x游戏开发中,.plist文件通常用于存储图像序列,如动画帧或精灵表,以便于程序加载和播放。这款工具的最新更新v1.2版增强了用户体验和功能性。 更新后的功能之一是允许用户通过双击图块列表上的图块名称或大图上的图块来快速复制图块名称到剪贴板。这一改进极大地提升了工作效率,用户不再需要手动输入或复制这些名称,尤其在处理大量图块时,节省了宝贵的时间。 新添加的“导出图块”功能是这次更新的亮点。这个功能使得用户能够将查看的图块直接导出为所需的文件格式,这可能是PNG、JPG或其他常用的图像格式。这对于需要将单个图块用于其他项目,或者进行进一步编辑的开发者来说非常实用。它简化了从.plist文件中提取特定图像的过程,避免了在不同软件之间切换的繁琐操作。 Cocos2d-x是一个广泛使用的开源2D游戏开发框架,支持多种平台,包括iOS、Android和Mac等。.plist图片查看工具与Cocos2d-x的结合,为开发者提供了一个直观的界面,以管理他们在游戏中使用的图像资源。通过这款工具,开发者可以预览和调整Cocos2d-x项目中的精灵表和动画,确保游戏视觉效果的准确性和流畅性。 在实际应用中,例如在创建角色动作或游戏场景的动画时,开发者可以利用此工具快速检查每个帧的细节,然后轻松导出需要的图块进行微调。此外,这个工具还可以用于教学和学习,帮助初学者理解.plist文件的结构和工作原理。 "plist图片查看工具 v1.2"是一款针对Cocos2d-x开发者和设计师的强大辅助工具,其最新的更新提升了用户交互性和实用性,为.plist文件的管理和使用提供了便利。无论是快速复制图块名称还是导出单个图块,这些功能都大大提高了工作效率,降低了开发过程中的复杂性。对于那些频繁处理.plist格式图像资源的人来说,这无疑是一个不可或缺的利器。

23,215

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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