亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么第一次循環正常,到第二次的時候就出錯了?

為什么第一次循環正常,到第二次的時候就出錯了?

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 關注
  • 231 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號