[問題] 64bit 下的 new 還會失敗嗎?

看板C_and_CPP作者時間8年前 (2017/02/10 14:24), 編輯推噓7(8138)
留言47則, 16人參與, 最新討論串1/1
在 32bit 環境下,邏輯記憶體只有 4G,要用完是有可能的 但 64bit 環境下,邏輯記憶體應該用不完吧? 那這樣還有必要處理 new 失敗的情形嗎? 計概學的很爛,有錯請指正,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.233.116.32 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1486736660.A.F9E.html

02/10 22:34, , 1F
你現在上網電腦的記憶體有無限大嗎?
02/10 22:34, 1F

02/10 22:34, , 2F
如果是的話,就不用考慮new失敗
02/10 22:34, 2F

02/10 22:35, , 3F
如果不是的話,你怎麼會覺得不需要考慮new失敗?
02/10 22:35, 3F

02/10 22:37, , 4F
new會不會失敗跟作業系統無關,跟你的電腦記憶體有多少
02/10 22:37, 4F

02/10 22:37, , 5F
有關
02/10 22:37, 5F

02/10 22:37, , 6F
有錯請指正
02/10 22:37, 6F

02/10 22:45, , 7F
我以為邏輯記憶體沒爆的話,記憶體不夠會拿硬碟當記憶體用
02/10 22:45, 7F

02/10 22:48, , 8F
沒事不會讓你用到完的啦
02/10 22:48, 8F

02/10 23:34, , 9F
C++ constructor 是可以主動丟 exception 的
02/10 23:34, 9F

02/10 23:36, , 10F
你可以試試看用到開始swap硬碟當記憶體 程式效能如何
02/10 23:36, 10F

02/10 23:37, , 11F
new 失敗未必是記憶體不足,還是得處理其它的錯誤。
02/10 23:37, 11F

02/11 00:41, , 12F
拿硬碟是虛擬記憶體的設定,也不是無限大啊
02/11 00:41, 12F

02/11 00:43, , 13F
那你硬碟也爆了要怎麼辦?
02/11 00:43, 13F

02/11 00:55, , 14F
用硬碟當記憶體是一個悲劇的開始
02/11 00:55, 14F

02/11 04:35, , 15F
x64 os還是要處理,就算你覺得mem用不完,那也是你現在
02/11 04:35, 15F

02/11 04:35, , 16F
的情況,有些starter os支援有memory 根本不到16g,就算
02/11 04:35, 16F

02/11 04:35, , 17F
有好了,實際插16g,這個大小在很多領域都很容易爆,像是
02/11 04:35, 17F

02/11 04:35, , 18F
影像處理。
02/11 04:35, 18F

02/11 09:29, , 19F
用到硬碟爆掉,那也沒辦法處理了,直接crash也是可接受的事
02/11 09:29, 19F

02/11 09:30, , 20F
何況我用到爆記憶體開始用硬碟的時候,那龜速根本無法忍耐
02/11 09:30, 20F

02/11 09:33, , 21F
倒是使用的library有可能因為別的因素new失敗這點沒考慮到
02/11 09:33, 21F

02/11 10:05, , 22F
反正判斷一下就不會出錯,你沒判斷出錯了怎麼辦?沒有
02/11 10:05, 22F

02/11 10:05, , 23F
東西是無限的
02/11 10:05, 23F

02/11 10:26, , 24F
同意樓上,也養成好習慣,沒養成好習慣,要是寫embedded
02/11 10:26, 24F

02/11 10:26, , 25F
system的code會很慘
02/11 10:26, 25F

02/11 15:22, , 26F
我的筆電就沒有開虛擬磁碟,因為太消耗,瀏覽器分頁開太
02/11 15:22, 26F

02/11 15:22, , 27F
多就滿出來了
02/11 15:22, 27F

02/12 00:48, , 28F
mem不夠crash沒關系?試想一下早期word裡,用到一半crash
02/12 00:48, 28F

02/12 00:48, , 29F
有誰可接受。
02/12 00:48, 29F

02/12 09:57, , 30F
先確定當前運作的 process 的資料分頁能被系統 swap 到硬
02/12 09:57, 30F

02/12 09:57, , 31F
碟再說吧
02/12 09:57, 31F

02/12 13:32, , 32F
怎麼聽起來判斷一下會要你的命一樣XDDD
02/12 13:32, 32F

02/12 15:47, , 33F
寫判斷code會多很多,而且也不知道到底怎麼寫比較正確
02/12 15:47, 33F

02/12 15:49, , 34F
到真的爆記憶體的時候,還能夠開檔案寫入錯誤訊息嗎?
02/12 15:49, 34F

02/14 10:42, , 35F
IO與記憶體管理有滿天 assert , catch 是很正常的
02/14 10:42, 35F

02/14 11:54, , 36F
你要確認你的東西不會被ulimit卡... 並不是所有linux
02/14 11:54, 36F

02/14 11:54, , 37F
app都可以用無限資源去跑的
02/14 11:54, 37F

02/14 18:30, , 38F
之前筆電只有8GB開Chrome也是crash
02/14 18:30, 38F

02/14 21:53, , 39F
看ㄧ下8086架構的定址方法
02/14 21:53, 39F

02/15 23:45, , 40F
好奇要怎麼對記憶體不夠作錯誤處理?有大大可以分享嗎?
02/15 23:45, 40F

02/16 12:53, , 41F
More Effective C++, Item 8
02/16 12:53, 41F

02/16 12:54, , 42F
真的要提怎麼針對記憶體new不出來可以寫成一整本書了
02/16 12:54, 42F

02/16 12:55, , 43F
有handler處理(C/C++) 有try-catch bad-alloc(C++)
02/16 12:55, 43F

02/16 12:55, , 44F
也有自己做memory management(STL)
02/16 12:55, 44F

02/16 12:55, , 45F
不過以C++來講 比較通用的方法是抓bad-alloc
02/16 12:55, 45F

02/16 12:56, , 46F
自己做子系統的話 通常是placement new/delete
02/16 12:56, 46F

02/16 12:57, , 47F
C場合似乎唯一的解法就是handler了
02/16 12:57, 47F
文章代碼(AID): #1OdSqK-U (C_and_CPP)