10. C++的內存管理
在C++中,內存被分成五個區(qū):棧、堆、自由存儲區(qū)、靜態(tài)存儲區(qū)、常量區(qū)
- (一) 棧:存放函數的參數和局部變量,編譯器自動分配和釋放
- (二) 堆:new關鍵字動態(tài)分配的內存,由程序員手動進行釋放,否則程序結束后,由操作系統(tǒng)自動進行回收
- (三) 自由存儲區(qū):由malloc分配的內存,和堆十分相似,由對應的free進行釋放
- (四) 全局/靜態(tài)存儲區(qū):存放全局變量和靜態(tài)變量
- (五) 常量區(qū):存放常量,不允許被修改
11. C++中內存泄漏的幾種情況
內存泄漏是指己動態(tài)分配的堆內存由于某種原因程序未釋放或無法釋放,造成系統(tǒng)內存的浪費,導致程序運行速度減慢甚至系統(tǒng)崩潰等嚴重后果。有以下幾個原因:
- 1)類的構造函數和析構函數中new和delete沒有配套
- 2)在釋放對象數組時沒有使用delete[],使用了delete
- 3)沒有將基類的析構函數定義為虛函數,當基類指針指向子類對象時,如果基類的析構函數不是virtual,那么子類的析構函數將不會被調用,子類的資源沒有正確釋放,因此造成內存泄露
- 4)沒有正確的清楚嵌套的對象指針
12. new、delete、malloc、free之間的關系
- new/delete,malloc/free都是動態(tài)分配內存的方式;
- new/delete是運算符,編譯器保證調用構造和析構函數對對象進行初始化/析構,但是庫函數malloc/free是庫函數,不會執(zhí)行構造/析構;
- new會自動計算需分配的空間,malloc不行;
- new是類型安全的,而malloc不是;
- new返回指定類型指針,malloc返回void*指針,需要強制類型轉換;
- new可以被重載,malloc不能
- new底層調用malloc函數分配內存,然后調用構造函數
13. delete和delete[]的區(qū)別
- a) delete只會調用一次析構函數,而delete[]會調用每個成員的析構函數
- b) 用new分配的內存用delete釋放,用new[]分配的內存用delete[]釋放
delete和delete[]是用于釋放動態(tài)分配的內存的C++關鍵字,它們之間有一些重要的區(qū)別:
1. delete用于釋放通過`new`分配的單個對象的內存,而delete[]用于釋放通過`new[]`分配的數組的內存。
2. 釋放數組必須使用delete[],而不能使用delete。因為對于使用`new[]`分配的動態(tài)數組,編譯器在內存中存儲了有關數組長度的額外信息,這樣在釋放數組時才能正確處理。
3. delete和delete[]的用法不同。delete用于對單個對象的指針進行釋放,例如`delete obj;`。delete[]用于對數組的指針進行釋放,例如`delete[] arr;`。
4. delete要求指針指向通過`new`分配的單個對象,而delete[]要求指針指向通過`new[]`分配的數組。如果不符合要求,行為是未定義的。文章來源:http://www.zghlxwxcb.cn/news/detail-607174.html
總結來說,delete和delete[]的最主要的區(qū)別在于對于動態(tài)數組的釋放:delete用于釋放單個對象的內存,而delete[]用于釋放動態(tài)數組的內存,并且使用方式也不同。使用delete來釋放通過new[]分配的數組會導致未定義行為,同樣使用delete[]來釋放通過new分配的單個對象也會出錯。因此,為了避免內存泄漏和意外行為,需要正確選擇delete或delete[]來釋放對應的內存。文章來源地址http://www.zghlxwxcb.cn/news/detail-607174.html
到了這里,關于C++基礎知識點整理筆記(四)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!