2016-11-24 70 views
0

我想知道C++編譯器如何與動態內存分配硬件交互。CPP動態內存恢復

例如,當一個C++可執行文件向操作系統請求內存時,該訪問有多直接?

如果動態內存已分配,然後手動重新分配,是否仍可以恢復丟失的數據?也許在操作系統記錄或作爲內存分配的結果而不是編譯器翻譯一次完全翻譯的結果?

是否可以恢復動態分配的數據?

+0

你的意思是分配和重新分配的?你可以把它放在代碼中嗎?一般來說,檢索駐留在看似解除分配的內存中的數據的機會非常高。 – MikeMB

+0

爲了說明起見,我們假設它使用一個指針在一個設定的長度上賦值new,然後在相同大小的同一個指針上重新分配。 – bigcodeszzer

+0

我目前的電腦沒有C++,或者我會提供代碼。 – bigcodeszzer

回答

1

在大多數操作系統和大多數編譯器版本中,當程序啓動時,會爲new和其他動態分配預留一定量的內存。內存管理器的實現以某種方式對內存進行分區,並設置一些數據結構以便輕鬆地處理請求。當你請求內存時,如果有足夠大的塊來保存你的請求,那麼內存管理器就會阻止它,並且當你釋放某些東西時,它會將它放回池中供將來考慮。

如果您提出請求並且沒有可用空間,那麼內存管理器可以使用一些策略。在某些系統上,對於非常大的分配,內存管理器將只使用mmap並讓操作系統返回一塊內存。在其他系統上,它將使用系統調用如sbrk從操作系統獲取更多內存,然後按照與現有內存相同的方式進行分割。

如果在程序中泄漏了內存,那麼程序的內存管理器將永遠不會回收該內存,並且只要程序正在運行,程序就不可用。如果你的程序再也不需要那個內存,那就完全沒問題 - 它可以回收以前解除分配的塊 - 但是如果它需要更多內存,它會向操作系統請求更多空間。

當進程退出時,所有現代操作系統都會自動回收進程分配的所有內存,因此一旦進程終止,所有分配的內存都將被釋放。除了一個殘酷和不尋常的操作系統,一個泄漏大量內存的程序永遠不會永久禁止其他程序使用該內存。

東西要記住的是,你要在你的程序的工作記憶是虛擬內存而不是物理內存。每個程序都認爲它已經完全使用了所有的系統內存,但實際上操作系統總是重新定位內存或根據需要將內容分頁到磁盤。從這個意義上講,即使你的程序確實向操作系統提供了系統中的所有內存,它也不會阻止其他程序運行 - 這隻會導致進程像它認爲的那樣瘋狂地減速不斷獲取頁面進出。

+0

有沒有辦法迫使操作系統完全按照要求提供一塊內存?如果是這樣,是否必須執行我的程序集? – bigcodeszzer

+0

或者更恰當地說,強制硬件提供訪問權限,因爲我想操作系統不再涉及這一點。 – bigcodeszzer

+0

因此,如果我想在機器中的RAM芯片中分配/確切/地址。 – bigcodeszzer