为了账号安全,请及时绑定邮箱和手机立即绑定

为什么第一次循环正常,到第二次的时候就出错了?

为什么第一次循环正常,到第二次的时候就出错了?

C++
长风秋雁 2023-04-01 14:10:53
部分代码:class ChunkInfo{public:char *buffer_address;//内存块的地址long realsize;//内存块的大小ChunkInfo(){}ChunkInfo(char *buffer,long size){this->realsize = size;this->buffer_address = buffer;}};list<ChunkInfo> CHUNK_INFO_LIST;ifstream in;in.open(inpath.c_str(),ios::in|ios::binary|ios::ate);ifstream::pos_type size = in.tellg();in.seekg(0,ios::beg);//指针回到头部//如果文件大小大于1.5GB就分块读取,每块设置大小1.5GB,并把信息构造在ChunkInfo中,然后保存在list里。if(size>MAX_SIZE_BIT){cout<<"A"<<endl;while(in.good()){cout<<in.tellg()<<endl;//第一次循环正常,到第二次的时候就在这出错了char *chunk_buffer = new char[CHUNK];in.read(chunk_buffer,CHUNK);long real_size = (long)in.gcount();ChunkInfo chunk(chunk_buffer,real_size);CHUNK_INFO_LIST.push_back(chunk);}in.close();}
查看完整描述

2 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

C++自己的流API似乎不支持,必须使用操作系统提供的api
如果是windows,应该使用file mapping相关的api,看CreateFileMapping之类函数的MSDN说明吧

即使不大于2G在绝大部分情况下,大于1.5G放内存都是不可能的。缺省C++api使用的是堆,而堆的内存块是很小的。分配给用户端的内存总共才2G,其中很多还要分配给系统和代码。如果逆要使用超过几百M的内存,就需要好好研究虚拟内存系统,不能直接指望C++API了

查看完整回答
反对 回复 2023-04-03
?
POPMUISE

TA贡献1765条经验 获得超5个赞

大文件可以被一部分一部分地读,这在windows里被以虚拟内存映射文件的方式实现。而不能用其本身的文件流,因为它自己是调用系统API实现的,而又缺少参数,便保险地映射全部文件到内存,而一般系统的虚拟地址空间为用户2G,服务器上才3G。而2G里显然要包括程序文件本身与环境子系统DLL们。所以剩下不足2G了,这下就不够用了,所以不能用C++里的文件流。用windows系统自带的API函数可以实现分块映射读取,当然读完一块要释放掉,不然最后还是不够用,这样就行了,你可以看书去了。

查看完整回答
反对 回复 2023-04-03
  • 2 回答
  • 0 关注
  • 115 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信