C 中,如果寫乙個無限迴圈,無限用new申請空間,會發生什麼?

時間 2021-05-06 21:23:27

1樓:元昊545

之前有一次由於遞迴沒寫退出,無意識的幹過此事……

32位系統會記憶體使用一直上去,直到2G後程式崩潰。

64位系統會直接因為記憶體溢位而藍屏

2樓:天空之淚

我試過,編譯器為visual studio2019,無限分配記憶體卻不主動釋放會導致記憶體占用一直增加,到達某個程度編譯器會強制報錯

3樓:楓沫言

我是題主,我開了個虛擬機器自己試了一下

win7 dev-C++

跑了一會就被殺了

然後試著賦值結果還是被殺了?還是說我方法不太對https://www /video/1245131457733578752

4樓:pansz

這個具體表現與很多因素相關。包括編譯器與作業系統。所以沒法準確的給出結論。

在Windows下會卡一陣子,然後就一直卡著;

在Linux下會卡一會兒,然後這個程序最終被作業系統乾掉。

在MacOSX下也卡一會兒,然後記憶體占用始終不增加了。(因為記憶體壓縮機制的原因)

具體情況有很多其它因素影響,所以我這個結論並不是唯一可能出現的情況,你遇到的可能是其它樣子

通常而言,系統並不會提示記憶體不足。早期的Windows版本可能會試圖彈出記憶體不足的對話方塊,不過現實就是在那種狀態下已經極度卡頓,根本不可能彈出那個對話方塊。

弄清楚為什麼會發生這樣的情況,其實還是有意義的。有興趣有時間的可以自己嘗試一下。

5樓:貴乎藥丸

昨天半夜看到這個問題,特地今天早起回答一下開始記憶體上公升並不明顯,執行好久之後,記憶體佔用量都沒超過QQ開始變狠

比上乙個快了,但還是沒其他答案上公升的快

(事後發現他們的單位尺是60分鐘。。我的是4分鐘。。。)繼續加碼。。

結局好像也沒啥。。

突然想起來我是不是可以用malloc。。。

6樓:

好像也沒有什麼,記憶體占用一直上公升,占用4G左右,程式丟擲異常「程式異常中斷」,之後記憶體被釋放。

win 10,vs2019

7樓:馬天翼

c版本的試過。

十年前搞了小程式,寫了個死迴圈,迴圈裡面做malloc操作,編成exe。

讓舍友在他電腦執行,他電腦是繼承自他剛畢業的表哥那裡,電腦已經有四年的壽命了。

啟動後直接宕機了。

舍友很生氣。

8樓:以理服人

用vs2019寫過乙個遞迴,我覺得可以參考一下

當一時nc,用遞迴證某個近似公式,大概就是,求乙個級數的求和,然後手賤敲了個10億上去,十億的遞迴,我眼睜睜的看著我電腦16g記憶體一點點佔滿然後宕機重啟

9樓:悽臨雨

這個嘛,如果系統裡只有windows自家的程式和驅動,估計是不會有問題的。WinPE下使用MemCheck軟體分配耗盡系統記憶體時,系統基本是不會宕機的,只要剩下1MB記憶體應該就不會死。

c++(64位)這邊申請的記憶體,首先位址會不斷占用,但是48位位址肯定夠用所以無所謂,new申請是會分配具體記憶體的,malloc可以不分配。

無論如何都會先耗盡物理記憶體+頁面檔案空間。此時c++本身沒有問題,它足夠簡單所以不大會出錯,出問題的很可能是其他程式和驅動。當然HeapAlloc在擴大堆空間時核心部分可能需要一些空間對此進行管理,如果核心那裡申請不到那一點點管理記憶體的記憶體可能就有麻煩了。

因為windows沒有缺記憶體時主動刪程式的功能,所以要麼是某個使用者態程式先出錯,要麼是驅動出錯,要麼是管理記憶體的記憶體出錯。

10樓:

win下用vscode試了下,每次申請小塊記憶體的時候,不會報bad_alloc異常,而是直接退出了。

改成每次申請大塊記憶體的話,則會報bad_alloc異常。

奇怪的是,這兩種情況,不管是否在申請後去讀寫記憶體,最後都會固定的申請到2G左右的物理記憶體然後退出。大佬們這是為什麼呢?

11樓:DVA的機甲

我們當時學ICS的時候,有乙個小作業是無限建立子程序或者子執行緒,看看會發生什麼。我在我自己Ubuntu上實驗的結果當然是記憶體炸了卡死了然後我強制重啟。

於是機智的我想到要不要去伺服器上試試(我們給每個同學配置了乙個伺服器帳號),然後那個伺服器就宕機了,好幾個班的人突然都沒得用了hhh……然後老師發了個群公告說同學們不要在伺服器上搞這個作業((逃)

12樓:

@echo off

:start

start "%~f0"

goto start

多年不用批處理,語法不一定對,明白意思就好[如果要嘗試,請一定先儲存所有工作]

13樓:Shuaixr

拿了個渣渣配置的manjaro跑了下

剛開始是這樣

被我玩了幾次後

因為是動態swap所以從剛開始的955m乾到1.9G嗯...剛學c++和Linux也不清楚原理,就讓大佬們回答吧

14樓:劉生

也不會怎麼樣, 就一直分配空間唄, 直到有一次沒空間可分配了, 會拋乙個badalloc 異常, 然後, 你的程式就退出了,(也許退出之前會彈個框框告訴你, 你的程式出問題了) 像從來沒有啟動過一樣。

15樓:real墨蘭

曾經在學校的電腦上試過c的malloc,開啟任務管理器,當記憶體使用達到80%(好像是這個數,具體記不清了)就不變了,也沒終止,無事發生

16樓:undefined

感覺應該不會很快耗盡物理記憶體,因為你只是分配了但是沒有碰。。。

但是如果你的記憶體不夠大(我直覺上這個足夠大應該會很大)的話,allocator自己維護的資料可能也會耗盡物理記憶體,然後在耗盡位址空間之前引起各種低記憶體現象。

如果allocator至少為每塊被分配的記憶體維護其位址和長度,同時又不使用其他任何資料的話,這個量級也在2^63,因為你分配的是個int。

另外其實我挺想看一下每次分配大塊記憶體最後會怎樣,比如每次分配乙個int[1073741824],但是我不想自己試...emm...哪位膽子大的來試一下唄。

17樓:

Manjaro (Linux 4.19), g++ 實測,直接宕機,只能長按電源鍵關機。幸好 Chrome 支援恢復崩潰網頁,不然血虧。

但在我的 vmware arch 上跑,剛 OOM 立刻就被 kill 掉。

18樓:身高1公尺868

鵝。。#include

using namespace std;

int main()

i7 10th 16G

win10 1909 64位 VScode編譯編譯和執行的時候都是占用記憶體1900M左右時自動沒了估計是被系統kill了?

19樓:

New操作符會在虛擬記憶體裡申請,然後系統會根據實際情況commit,真正去分配物理記憶體。核心通常有OOM機制,會在記憶體不足時把程序殺掉。

我覺得你倒不如在乙個無限迴圈中去fork子程序(逃

20樓:qin meng

不會怎麼樣linux上會被oom kill掉,windows上沒試過,但是因為它也有pagefile,所以會分配到一定程度new會返回a為null,然後程式應該會繼續跑,系統是不會死的。

21樓:哎呦喂

大學時C語言上機,和同學說看誰的程式最先藍屏,然後我寫了個迴圈,只申請不釋放空間,最終藍屏了。

十幾年前的事了,現在的話,不同的系統和編譯器可能有不同的處理機制,不一定會藍屏,我也搞不懂,畢竟不是正規碼農。

22樓:DLM-fakeS

new 到一定程度會失敗。另外,如果申請的記憶體不需要進入 commit 狀態,也就是你沒有讀寫它,那麼就意味著這塊記憶體是在虛擬記憶體世界裡的虛擬存在,可以不占用物理記憶體。所以你從系統角度看,沒什麼現象發生。

如果是 commit 狀態,會導致系統有些卡頓,響應變慢,如果有好幾個程序是這種高記憶體占用狀態,將使得系統進入一種相當於停止響應的狀態,這時候使用者只能按電源 n 秒鐘,強制關機,再重啟。

23樓:

具體各系統平台的實現不清楚。

單從c++來說,應該是分配失敗,會丟擲std::bad_alloc異常,然後沒有捕獲異常就呼叫std::terminate() 退出了

24樓:dm2

win下嘗試會讓系統變得非常不穩定

Linux下面會被kill

25樓:守望

私以為這是乙個好問題。

或許你可以說,最終系統重啟,或者藍屏什麼的,真的是這樣嗎?這個過程涉及的知識卻不少,比如new時如何申請記憶體,記憶體限制是多少?會不會影響其他程式?

和當前剩下的物理記憶體有關嗎?分配策略是怎樣的?

以linux為例,你試一下就會發現,可能執行著會被kill,為什麼呢?因為觸發了OOM機制,怎麼觸發的?策略是怎樣的?

當然內容還有很多,我覺得自己是講不清楚的,我不知道為什麼會這麼多人覺得水。

26樓:

這麼水的問題也問。

你只需知道,作業系統有一種叫做記憶體交換檔案的技術。當系統記憶體不夠的時候,系統會根據一定演算法,把一些它認為不重要的記憶體內容寫到硬碟上,騰出空間給申請記憶體的程式。

當你這個程式執行起來以後,可用記憶體逐漸減少,減到某個數量以後,系統開始進行記憶體交換,開始的時候寫到硬碟上的都是些無關緊要的系統元件,逐漸地,一些比較重要的系統元件也被寫入檔案,但這些元件又要經常用,因此稍候又會被恢復回來,你就能發現,硬碟讀寫越來越頻繁,最後幾乎是不停的讀寫了,最後,這一切以藍屏或自動重啟結束。

你如果穿越到乙個無限迴圈的世界裡,會發生什麼?

鹹魚本鹹 世界的時間線是迴圈的那種的話,我會借助這個時間線無限的擴充我的自我認知能力,然後邊做實驗,直到找到離開時間迴圈的方法,然後重點來了,當真的可以離開的時候,我會先留下來,把其他疑惑解決掉,然後到達全知。然後重點來了,離開迴圈空間的第一件事讓自己長生不老,接著去幹上帝幹的事情。 會死很多次。我...

有沒有這樣乙個無限不迴圈小數?

739085 你這個數不符合實數的表示,但可以理解為乙個超現實數。x 0.999.199.9 這個數在我們的世界是無限小數,但在乙個更大的超現實數模型中卻是乙個有限小數。比如1在第n位,如果對所有自然數a都有n a,那麼n在我們的視覺看來是無限遠。但在更大的模型中有上界n 1,相對化來看n就成了有限...

乙個無限迴圈的心結,讓我無從下手,不想傷人傷己我該如何?

逍遙遊 認栽。承認自己一腔深情都喂了狗。走路多了,踩到坑,崴了腳,你是打算砍了自己的腳,還是啟動修路工程?當然是罵幾句自己不長眼,接著往前走。 愛吃甜品的羊角茉莉 emmm,如果真的死迴圈,而且解開以後會傷人傷己的話,想辦法傷人然後解開吧,哈哈哈哈。畢竟大家都只是對方生命中的過客罷了,你傷了他 她,...