網(wǎng)站空間的控制面板首頁seo推廣培訓
本節(jié)目標
一、C/C++內(nèi)存分布
二、C語言中動態(tài)內(nèi)存管理方式
三、C++中動態(tài)內(nèi)存管理
四、operator new與operator delete函數(shù)
五、new和delete的實現(xiàn)原理
六、定位new表達式(placement-new)
七、常見面試題
一、C/C++內(nèi)存分布
- 一個程序占用的內(nèi)存主要有以下幾部分
- 棧區(qū)(stack)編譯器自動分配與釋放,存放運行時函數(shù)分配的局部變量,函數(shù)參數(shù),返回數(shù)據(jù),返回地址等,類似與數(shù)據(jù)結(jié)構(gòu)里面的棧
- 堆區(qū)(heap)一般由程序員進行分配,若沒有釋放,可能導致內(nèi)存泄露
- 全局區(qū)(靜態(tài)區(qū)static)存放全局變量,靜態(tài)數(shù)據(jù),常量,程序結(jié)束后由系統(tǒng)釋放,全局區(qū)又分為已初始化全局區(qū)和未初始化全局區(qū),未初始化的放一邊,已初始化的放一邊
- 常量區(qū)(文字常量區(qū))存放常量字符串 程序結(jié)束后系統(tǒng)釋放
- 代碼區(qū)(存放二進制代碼)存放函數(shù)體等二進制代碼
二、C語言中動態(tài)內(nèi)存管理方式
- 四個函數(shù): malloc , calloc , realloc , free
- 1.
- malloc 動態(tài)開辟一塊連續(xù)的空間,自己決定開辟多少
- malloc底層使用brk和mmap函數(shù)實現(xiàn)的,當開辟空間小于128k時用brk,大于128k時用mmap
- malloc是從堆中獲取空間,當收到申請空間的申請時,操作系統(tǒng)中有一個記錄空閑內(nèi)存地址的鏈表,此時會遍歷此鏈表,尋找第一個已釋放,且空間大于所申請空間的堆結(jié)點,將該節(jié)點刪除,該節(jié)點空間給新程序
- 用法:
- 2.
- calloc 開辟空間同時初始化 等于malloc+memset
- 用法:
- 3.
- realloc 對開辟的空間大小進行修改
- 用法:
- 4.
- free 釋放開辟空間
- 用法:
- 相關(guān)面試題:
- malloc/calloc/realloc區(qū)別?
- malloc的實現(xiàn)原理?
三、C++內(nèi)存管理方式
C語言內(nèi)存管理方式可以繼續(xù)在C++中使用,但有些地方就有點無能為力,而且使用起來有些麻煩,因此C++有自己的內(nèi)存管理方式,通過new和delete操作符來管理動態(tài)內(nèi)存
1.new/delete操作內(nèi)置類型
- new 跟 malloc 類似
- delete 跟 free 類似
- 注意:釋放多空間要加【】
- 注意:申請和釋放單個空間,使用new 和 delete, 申請和釋放多個空間,使用new[]和delete[]
2.new和delete操作自定義類型
- 用new創(chuàng)建一個新類對象,跟malloc不同的是,new還會調(diào)用類的構(gòu)造函數(shù)
- 用delete刪除的話,則會調(diào)用類的析構(gòu)函數(shù)
- malloc跟free都不會調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)
四、operator new與operator delete函數(shù)(重要點進行講解)
- 總結(jié):
- malloc 申請空間
- operator new 申請空間+報錯
- new 申請空間+報錯+初始化
- new底層用的operator new, operator new 底層用的malloc
五、new和delete的實現(xiàn)原理
1.內(nèi)置類型
2.自定義類型
六、定位new表達式(placement-new)了解
- 定位new表達式是在已分配的原始內(nèi)存空間中調(diào)用構(gòu)造函數(shù)初始化一個對象
- 使用格式:
- 使用場景:
- 使用例子:
七、常見面試題
- 1.什么是內(nèi)存泄露?內(nèi)存泄露的危害?
- 2.內(nèi)存泄露分類?(了解)
- 3.如何檢測內(nèi)存泄露?(了解)
- 4.如何避免內(nèi)存泄露?