C++内存管理与分配方式
C++的內存管理與內存分配方式,實際上是兩個問題。
C++程序在編譯與運行過程中,實際上可能用到五種存儲區域。
?
為什么這里沒有提到自由存儲區?
因為自由存儲區和這里提到的五種存儲區是兩個維度的概念,針對這個問題我們一點一點來分析。
自由存儲區和堆往往是容易混淆的地方。因為我們知道,C提供了malloc/free這對函數來提供動態內存的申請和釋放。而malloc函數申請的內存位置在堆上。C++在繼承了C語言的malloc/free的基礎上,還提供了new/delete這對保留字來提供更加便捷的動態內存申請與釋放。
malloc函數只分配空間,不調用任何構造函數,返回的是指向分配到的空間的void型的指針,如果失敗了就返回NULL指針。
而new不僅申請動態空間,同時會調用該類型變量的構造函數。如果分配成功會返回該類型的指針,失敗了會返回bad_alloc異常。
而這兩個函數申請的動態空間位置的定義,是最令人混淆的地方。malloc函數明確說明,分配的位置在堆上,這點沒有異議。而new分配的位置,按照Bjarne Stroustrup的說法,是在free store(自由存儲區)上。那么,自由存儲區就是堆嗎?還是C++另外開辟的一塊內存空間?
實際上,C++的實際內存空間如上所述,只有這五種,而自由存儲區,是一種抽象的概念,而不是內存中的實際區域。可以這樣認為:自由存儲區就是new分配的區域。而自由存儲區的底層,具體的內存空間,還應當是上述五種空間之一。因為C++的默認new是使用malloc實現的,所以大多情況下,自由存儲區都建立在堆的基礎上。但是,如果對new進行重載,則可以使用其他區域實現自由存儲區。
?
而在分配內存時,有三種方式
動態內存的生存期由程序員決定,使用非常靈活,但如果在堆上分配了空間,就有責任回收它。
轉載于:https://www.cnblogs.com/mockingbirdbad/p/10582009.html
總結
以上是生活随笔為你收集整理的C++内存管理与分配方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BeanFactory笔记
- 下一篇: java中getClass().getR