10-內存空間佈局

寫在前面

每一個應用都有本身獨立的內存空間--今天不會講太多代碼,主要是理論。
複製代碼

名詞解釋

每一個應用都有本身獨立的內存空間,其內存空間通常都有如下幾大區域
棧空間,堆空間,代碼區,全局區,其實咱們主要關心的是堆區,由於咱們的代碼的聲明週期都在堆區裏完成。
複製代碼
名 稱 說明 做用
堆空間 每調用一個函數就會給它分配一段連續的棧空間,等函數調用完畢後會自動回收這段棧空間 自動分配和回收
堆空間 須要主動去申請和釋放 好比類的對象的建立
代碼區 代碼段(代碼區) 用於存放代碼
全局區 數據段(全局區) 用於存放全局變量等

碼上建功 --堆空間

在程序運行過程,爲了可以自由控制內存的生命週期、大小,會常常使用堆空間的內存
堆空間的申請\釋放
malloc \ free 
new \ delete
new [] \ delete []

是否是有點速度快,Java和OC中局可使用new來初始化一個對象。
來看幾個栗子
// 沒有初始化
int *p1 = new int;
// 初始化爲0
int *p2 = new int();
// 初始化爲5
int *p3 = new int(5);
// 沒有初始化
int *p4 = new int[3];
// 所有元素初始化爲0
int *p5 = new int[3]();
// 所有元素初始化爲0
int *p6 = new int[3]{};
// 首元素初始化爲5,其餘元素初始化爲0
int *p7 = new int[3]{ 5 };

這樣作有什麼問題沒,C++ 可沒有ARC和GC管理機制
new 這麼多的對象,確定形成內存泄露了。
每new一次就要在不使用的時候銷燬(delete),要成對出現
int *p = new int;
delete p;

複製代碼

碼說 --棧空間 全局區

定義一個結構體
struct Person {
    int m_age;
};
// 全局區
Person g_person;
// 棧空間
Person person;
int main() {
    // 棧空間
    Person person;
    // 堆空間
    Person *p = new Person();
    p->m_age = 20;
    delete p;
    //舉一個malloc的栗子
    Person *p2 = (Person *) malloc(sizeof(Person));
    free(p2);
}

複製代碼

裝逼一下

申請堆空間成功後,會返回那一段內存空間的地址
申請和釋放必須是1對1的關係,否則可能會存在內存泄露
如今的不少高級編程語言不須要開發人員去管理內存(好比Java),屏蔽了不少內存細節,利弊同時存在
利:提升開發效率,避免內存使用不當或泄露
弊:不利於開發人員瞭解本質,永遠停留在API調用和表層語法糖,對性能優化無從下手 --奸笑
複製代碼

完整代碼demo,請移步GitHub:DDGLearningCppgit

固然C++大神就繞吧,非喜勿噴,畢竟這是我的的學習筆記📒github

相關文章
相關標籤/搜索