内存泄露的问题

lvjing1210 2011-08-31 06:04:05
请教各位,局部变量的大小是否会有限制?为什么我定义了一个2M的局部变量不能释放内存?
void fun()
{
char buf[1024][1024][2];
char buf1[1024][1024][2];
memset(&buf, 0, sizeof(buf));
}
int main(int argc, char *argv[])
{
int i=0;
printf("Hello, world!\n");
fun();
while(1)
{
};
return EXIT_SUCCES;
}
就是这样的一个小测试程序,fun函数执行过后会发现内存没有释放
fun执行前后的内存使用情况的对比:
Mem: 7528K used, 21616K free, 0K shrd, 0K buff, 3412K cached
Mem: 11636K used, 17508K free, 0K shrd, 0K buff, 3412K cached
...全文
159 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
moxiaomomo 2011-09-01
  • 打赏
  • 举报
回复
在栈上创建的静态空间应当不会发生内存泄露,在函数返回的时候内容已经被清空了
lvjing1210 2011-09-01
  • 打赏
  • 举报
回复
跟top 测试结果是一样的,而且fun执行完成后等待很长时间后仍然没有释放
lvjing1210 2011-09-01
  • 打赏
  • 举报
回复
用free也看过了,share buffers cache都没有变化
reckhou 2011-09-01
  • 打赏
  • 举报
回复
free
total used free shared buffers cached
Mem: 109180 55844 53336 0 0 23232
-/+ buffers/cache: 32612 76568
Swap: 0 0 0

上面这行是MEM用量,下面是缓冲区用量,你看一下是哪一行有偏差。
reckhou 2011-09-01
  • 打赏
  • 举报
回复
用free命令看一下,是不是同样的结果。
A19771979 2011-09-01
  • 打赏
  • 举报
回复
你用什么方法查看内存?如果在函数fun执行完立刻查看内存,有可能内存统计没有那么快更新。
天亮后说晚安 2011-09-01
  • 打赏
  • 举报
回复
不初始化
lvjing1210 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zmlovelx 的回复:]
引用 1 楼 lvjing1210 的回复:

如果对局部变量做初始化就会出现上述问题,不初始化的话内存大小是不变的


局部变量在栈上, 在进入函数前就已经预留了空间,不初始化只涉及栈top指针的移动. 不初始化的话,编译器可能优化掉它. 也可能不发生缺页中断.
[/Quote]
你说的没错,可是当fun()结束之后,局部变量的生命周期应当结束,占用内存空间也会被释放,现在给我的感觉是有点像静态局部变量,第一次调用fun()后内存会增加,之后再反复调用,内存就不会再增加了。
lvjing1210 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 louyong0571 的回复:]
楼主用top看的吗?如果是的话就正常,还当缓存用着,不是泄漏。
[/Quote]
是用top看的,可是buff 以及 cache大小没变化啊,你说的缓存又是指什么啊?
帅得不敢出门 2011-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lvjing1210 的回复:]

如果对局部变量做初始化就会出现上述问题,不初始化的话内存大小是不变的
[/Quote]

局部变量在栈上, 在进入函数前就已经预留了空间,不初始化只涉及栈top指针的移动. 不初始化的话,编译器可能优化掉它. 也可能不发生缺页中断.
ch_984326013 2011-08-31
  • 打赏
  • 举报
回复
我也觉得这不是泄露!释放内存不可以用free么?
louyong0571 2011-08-31
  • 打赏
  • 举报
回复
楼主用top看的吗?如果是的话就正常,还当缓存用着,不是泄漏。
justkk 2011-08-31
  • 打赏
  • 举报
回复
这个貌似与linux的内存管理思想有关
释放的内存并不是立即返还,而是作为缓存
这不是内存泄露
lvjing1210 2011-08-31
  • 打赏
  • 举报
回复
是否跟我使用的交叉编译工具arm-none-linux-gnueabi有关?
lvjing1210 2011-08-31
  • 打赏
  • 举报
回复
如果对局部变量做初始化就会出现上述问题,不初始化的话内存大小是不变的

23,118

社区成员

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

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