免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4411 | 回复: 9
打印 上一主题 下一主题

[C++] fstream 内存系统管理的问题/内存泄漏? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-14 14:26 |只看该作者 |倒序浏览
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
     fstream _file;
     long i = 0;
     _file.open("test.log", ios:ut);
     if(_file.good())
     {
         cout << " test.log open ok" << endl;
      }
      else
      {
          cout <<"test.log open err" << endl;

      }

      while(1)
      {
           _file << "------------------------------------------------------" << endl;
           i++;
           //_file.flush(); 跟flush无关 加了之后情况一样
           if (i > 10000000)
           {
               break;
           }
      }
      
      _file.close();
      return 0;
}
虚拟机上的Red Hat Linux 7.1 3.0.1-3 (在真实系统环境里 也会出现同样情况)

g++ -v:
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/3.0.2/specs
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --host=i386-redhat-linux
Thread model: posix
gcc version 3.0.2 20010905 (Red Hat Linux 7.1 3.0.1-3)

uname -r:
2.4.7-10

问题是在我在开发服务端程序时 定位到 只要程序执行写文件命令 系统当前可用内存 就会不断下降 ......  
无论程序是kill掉 还是正常return退出  可用内存都无法恢复......
于是写了上面的测试程序  可用内存占用情况依旧.....  不过只要将写的日志文件删除 就会出现可用内存的大幅度下降
执行完程序然后删除日志 可用内存只在执行前的基础上增加了28k

然后搜索了一下网上关于fstream内存泄露方面的信息  都没有很好的解决方案 google唯一有点有意义的建议就是 使用stringstream....(没用过)
特向各位高手请教 ,因为在服务器上跑的程序 都是要保存几个月的 不可能写完了就删 来恢复.....

[ 本帖最后由 senic 于 2008-12-14 15:03 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-14 14:39 |只看该作者
fstream 还会导致内存泄漏??? 占个位等高手来解说

论坛徽章:
0
3 [报告]
发表于 2008-12-14 14:42 |只看该作者
[root@localhost ~]# g++ -v
Using built-in specs.
Target: i386-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --enable-java-awt=gtk --disable-dssi --enable-plugin --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-cpu=generic --build=i386-redhat-linux
Thread model: posix
gcc version 4.3.0 20080428 (Red Hat 4.3.0- (GCC)

刚才在 新一点的环境和编译器 也试了一下  不删除文件 可用内存也被占用   

论坛徽章:
0
4 [报告]
发表于 2008-12-14 15:12 |只看该作者
刚才又把 测试代码  拿到xp上 用dev c++编译跑了一下
程序内存占用和 PE使用都是定值  未现大波动    .........
是操作系统 内存管理机制的问题?

论坛徽章:
0
5 [报告]
发表于 2008-12-14 15:49 |只看该作者
这个是linux文件系统的缓存机制。
不必在意这点内存的,系统会管理好。

论坛徽章:
0
6 [报告]
发表于 2008-12-14 15:57 |只看该作者

回复 #4 senic 的帖子

你写 的中 文 里面有 很多 空格
检查 内存泄漏 需要用专门的方法
光 盯着top看 是看不出来的

论坛徽章:
11
技术图书徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
7 [报告]
发表于 2008-12-14 15:59 |只看该作者
linux会用空闲内存做buffer cahe,和“内存泄漏”没任何关系。写文件时,vmstat可以看到buffer cache的增加,而top监控进程虚拟内存时应该变化不大

论坛徽章:
0
8 [报告]
发表于 2008-12-14 16:35 |只看该作者
其实 在实际环境中 服务端我已经跑了 2个多月 也并没有发现内存不足 程序当掉的问题  
程序开发完成之前也用valgrind检测过 ok了 才放上去的.  
但是给客户交货的时候 别人都会提出这个内存问题 不好解释.... 别人就看top结果...
同机也有其他的应用程序 同样是每天大并发量的处理  
由于日志都是通过我的程序保存(每天1-1.5G日志) ,所以在top结果上看来 跑了我的程序系统可用内存就直线下降
如果没有其他的办法 干脆也不保留日志 直接socket丢windows上去 或者开个ftp server  按小时备份了就删除..... 哈   郁闷

btw:  写日志模块我记得朋友之前在 rh as3上面 同样写大量日志 没有这种情况 ----   呵呵 可能是这个原因 个人版和服务器版的区别吧

论坛徽章:
0
9 [报告]
发表于 2008-12-14 16:37 |只看该作者

回复 #5 Fixend 的帖子

呵呵  别人2g的服务器  就因为跑了我的程序  可用内存显示一直在最低的 5m左右徘徊挣扎   
说不过去

论坛徽章:
0
10 [报告]
发表于 2008-12-14 16:47 |只看该作者
谢谢各位的热心回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP